django表单在init上而不是在meta类中排除字段

时间:2010-05-13 11:50:57

标签: django django-forms

我想根据传入的参数排除modelform的init函数中的某些字段,我该怎么做?我知道我可以使用模型表单的元类添加排除字段,但我需要它是动态的,具体取决于传入的变量。

由于

6 个答案:

答案 0 :(得分:10)

您可以在致电self.fields后修改super列表。

答案 1 :(得分:2)

您应该使用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',))

答案 2 :(得分:2)

您应该使用self._meta代替self.Meta,因为ModelForm.__new__方法获取self.Meta的属性并将其放入self._meta

答案 3 :(得分:1)

相关,为了从子类中排除字段,我扩展了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]

答案 4 :(得分:0)

请注意:如果从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。

答案 5 :(得分:0)

我是这样做的:

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