动态地包含/排除Django ModelForm的Meta类中的字段



假设我有一个表单,例如:

from django import forms
class Foo(forms.ModelForm):
class Meta:
model = SomeModel
fields = ('field1', 'field2', 'field3')

如何根据某些条件包含或排除字段?

编辑:

糟糕的是,我应该澄清一下,需要根据正在渲染的每个模型的值来设置条件。这意味着我需要根据当前渲染的模型的值添加(或删除(字段。

您可以通过__init__:修改表单字段

from django import forms
class Foo(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if condition:
self.fields.pop('field1')
class Meta:
model = SomeModel
fields = ('field1', 'field2', 'field3')

请注意,如果需要字段,这可能会导致表单的验证失败。

更好的方法可能是隐藏字段,而不是完全删除它:

class Foo(forms.ModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if condition:
form.fields['field1'].widget = forms.HiddenInput()
class Meta:
model = SomeModel
fields = ('field1', 'field2', 'field3')

最新更新