簡體   English   中英

django表單在init上而不是在meta類中排除字段

[英]django forms exclude fields on init rather than in the meta class

我想根據傳入的參數排除模型的init函數中的某些字段,我該怎么做? 我知道我可以使用模型表單的元類添加排除字段,但我需要根據傳入的變量進行動態處理。

謝謝

您可以在調用super之后修改self.fields列表。

您應該使用modelform_factory動態創建表單並傳入要排除的字段。

def django.forms.models.modelform_factory   (       
     model,
    form = ModelForm,
    fields = None,
    exclude = None,
    formfield_callback = lambda f: f.formfield()     
)   

所以像

modelform_factory(MyModel, MyModelForm, exclude=('name',))

你應該使用self._meta而不是self.Meta ,因為ModelForm.__new__方法獲取屬性形成self.Meta並將它們放入self._meta

相關,為了從子類中排除字段,我擴展了ModelForm類,如下所示:

 class ModelForm(djangoforms.ModelForm):
   def __init__(self, *args, **kwargs):
     super(ModelForm, self).__init__(*args, **kwargs)

     meta = getattr(self, 'Meta', None)
     exclude = getattr(meta, 'exclude', [])

     for field_name in exclude:
       if field_name in self.fields:
         del self.fields[field_name]

需要注意的是:如果從ModelAdmin類調用表單,只需為ModelAdmin創建一個get_form方法:

def get_form(self, request, obj=None, **kwargs):
    exclude = ()

    if not request.user.is_superuser:
        exclude += ('field1',)

    if obj:
        exclude += ('field2',)

    self.exclude = exclude
    return super(ProfessorAdmin, self).get_form(request, obj, **kwargs)

PS:通過方法“所有者”類改變ProfessorAdmin。

我是這樣做的:

class Meta:
    exclude = [field.label for field in Fields.objects.filter(visible=False)] + ['language', 'created_at']

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM