如何删除 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'))

这样您就可以在创建表单之前确定排除字段,然后将它们传递给工厂,而无需重写构造函数。