我想根据传入的参数排除模型的init函数中的某些字段,我该怎么做?我知道我可以使用模型表单的元类添加排除字段,但我需要根据传入的变量进行动态处理。
谢谢
我想根据传入的参数排除模型的init函数中的某些字段,我该怎么做?我知道我可以使用模型表单的元类添加排除字段,但我需要根据传入的变量进行动态处理。
谢谢
你可以修改 self.fields
打电话后列表 super
。
你可以修改 self.fields
打电话后列表 super
。
您应该使用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']