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