我想根據傳入的參數排除模型表單的init函數中的某些字段,我該怎麼做?我知道我可以添加使用元類的模型形式的排除字段,但我需要根據傳入的變量這是動態的。django表單在init中而不是在元類中排除字段
感謝
我想根據傳入的參數排除模型表單的init函數中的某些字段,我該怎麼做?我知道我可以添加使用元類的模型形式的排除字段,但我需要根據傳入的變量這是動態的。django表單在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',))
相關,以排除子類領域,我已經擴展了的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]
您應該使用self._meta
代替self.Meta
,因爲ModelForm.__new__
方法從self.Meta
獲得屬性並將它們放入self._meta
。
只是要注意:如果你的表格是從的ModelAdmin類調用,只需創建一個get_form方法爲的ModelAdmin:方法「老闆」級變化ProfessorAdmin:
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。
我做出這樣的:
class Meta:
exclude = [field.label for field in Fields.objects.filter(visible=False)] + ['language', 'created_at']
所以,我會需要輸入的內容。例如,如果我想從模型中刪除字段「名稱」 – John 2010-05-13 11:54:35
'如果'name'在self.fields:del self.fields ['name']' – KillianDS 2010-05-13 12:10:50