Как убрать поля на Django ModelForm? - PullRequest
0 голосов
/ 16 января 2020

Я хотел бы построить форму с динамическими полями в зависимости от потребностей, и я пробовал этот код, но не работает, форма модели показывает все поля.

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 ]

1 голос
/ 16 января 2020

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

from django.forms import modelform_factory

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

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

0 голосов
/ 16 января 2020

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

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

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...