如何删除 Django ModelForm 上的字段?
How to remove fields on Django ModelForm?
我想根据需要构建一个具有动态字段的表单,我已经尝试过此代码但不起作用,模型表单显示所有字段。
forms.py:
class CustomModelForm(forms.ModelForm):
class Meta:
model = app_models.CustomModel
fields = '__all__'
def __init__(self, excluded_fields=None, *args, **kwargs):
super(CustomModelForm, self).__init__(*args, **kwargs)
for meta_field in self.fields:
if meta_field in excluded_fields:
# None of this instructions works
-> del self.fields[meta_field]
-> self.fields.pop(meta_field)
-> self.fields.remove(meta_field)
有人可以帮助我吗?
提前致谢。
问题是 excluded_fields 的列表来自 model._meta.get_fields(),不是字符串列表,而且 if 条件没有很好地匹配,因为 self.fields 是一个 python ordereddict.
这段代码解决了问题:
class CustomModelForm(forms.ModelForm):
class Meta:
model = app_models.CustomModel
fields = '__all__'
def __init__(self, excluded_fields=None, *args, **kwargs):
super(CustomModelForm, self).__init__(*args, **kwargs)
show_fields = []
for field in excluded_fields:
show_fields.append(field.name)
for meta_field in list(self.fields):
if meta_field not in show_fields:
del self.fields[meta_field]
或者,您可以使用 modelform_factory
吗?
from django.forms import modelform_factory
CustomModelForm = modelform_factory(MyModel, exclude=('field_1', 'field_2'))
这样您就可以在创建表单之前确定排除字段,然后将它们传递给工厂,而无需重写构造函数。
我想根据需要构建一个具有动态字段的表单,我已经尝试过此代码但不起作用,模型表单显示所有字段。
forms.py:
class CustomModelForm(forms.ModelForm):
class Meta:
model = app_models.CustomModel
fields = '__all__'
def __init__(self, excluded_fields=None, *args, **kwargs):
super(CustomModelForm, self).__init__(*args, **kwargs)
for meta_field in self.fields:
if meta_field in excluded_fields:
# None of this instructions works
-> del self.fields[meta_field]
-> self.fields.pop(meta_field)
-> self.fields.remove(meta_field)
有人可以帮助我吗? 提前致谢。
问题是 excluded_fields 的列表来自 model._meta.get_fields(),不是字符串列表,而且 if 条件没有很好地匹配,因为 self.fields 是一个 python ordereddict.
这段代码解决了问题:
class CustomModelForm(forms.ModelForm):
class Meta:
model = app_models.CustomModel
fields = '__all__'
def __init__(self, excluded_fields=None, *args, **kwargs):
super(CustomModelForm, self).__init__(*args, **kwargs)
show_fields = []
for field in excluded_fields:
show_fields.append(field.name)
for meta_field in list(self.fields):
if meta_field not in show_fields:
del self.fields[meta_field]
或者,您可以使用 modelform_factory
吗?
from django.forms import modelform_factory
CustomModelForm = modelform_factory(MyModel, exclude=('field_1', 'field_2'))
这样您就可以在创建表单之前确定排除字段,然后将它们传递给工厂,而无需重写构造函数。