【问题标题】:How to remove fields on Django ModelForm?如何删除 Django ModelForm 上的字段?
【发布时间】:2020-01-16 08:11:11
【问题描述】:

我想根据需要构建一个动态字段的表单,我已经尝试过这段代码但不起作用,模型表单显示所有字段。

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)

有人可以帮助我吗? 提前致谢。

【问题讨论】:

  • 同样的代码适用于我(self.fields.remove() 除外)。你有任何错误吗?

标签: python django django-forms modelform


【解决方案1】:

或者,您可以使用modelform_factory吗?

from django.forms import modelform_factory

CustomModelForm = modelform_factory(MyModel, exclude=('field_1', 'field_2'))

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

【讨论】:

  • 但是我需要能够在对ModelForm_factory的调用中指定一个特定的表单,因为每一个都有自己的特点和不同的init和在init方法中传递参数。 form = modelform_factory(model = entry_model, form = entry_form, exclude = excluded_fields)。我怎么能这样做?
【解决方案2】:

问题是excluded_fields列表来自model._meta.get_fields(),不是字符串列表,if条件不匹配,因为self.fields是pythonordereddict。

这段代码解决了问题:

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]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 2010-10-05
    • 2018-07-17
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 2014-02-16
    相关资源
    最近更新 更多