Как удалить поля на 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)

Кто-нибудь может мне помочь? Заранее спасибо.

Всего 2 ответа


В качестве альтернативы, вы могли бы использовать modelform_factory ?

from django.forms import modelform_factory

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

Таким образом, вы можете определить поля исключения перед созданием формы и просто передать их в фабрику, тогда нет необходимости переопределять конструктор.


Проблема заключалась в том, что список exclude_fields был получен из model._meta.get_fields (), а не является списком строк, и условие if не подходило, потому что self.fields является заказным приговором Python.

Этот код решает проблему:

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]

Есть идеи?

10000