Django get_form приводит к несвязанной форме (или какой лучший способ получить параметры url в форму модели с помощью CBV createview?)

Я использую модель формы и CBV (createview) для построения формы.

Мне нужно было получить url-параметры в форму, чтобы я мог получить доступ к деталям из предыдущего представления, которое отправило пользователя на форму. Для достижения этой цели я сначала попробовал переопределить get_form следующим образом:

def get_form(self):
    form = AddDataForm(key_a=self.request.GET['a'], key_b=self.request.GET['b'])
    return form

Это не сработало. Форма не сохранялась (даже если все поля были правильно заполнены). Это привело бы к появлению несохраненной формы.

В итоге я получил положительный результат, используя get_form_kwargs следующим образом:

def get_form_kwargs(self):
    kwargs = super().get_form_kwargs()
    kwargs.update({'key_a': self.request.GET['a'], 'key_b':self.request.GET['b']})

    return kwargs

Мой вопрос в том, что в get_form (или мое непонимание этого) приводит к такому поведению?

Мой файл forms.py тоже ниже.

class AddDataForm(forms.ModelForm):
    class Meta:
        model = MiningTech
        fields = '__all__'
        exclude = ('user',)

    def __init__(self, key_a, key_b, *args, **kwargs): # key_a comes from the view's get_form.
            super(AddDataForm, self).__init__(*args, **kwargs)
    
            if len(key_a) > 3:
                for field_name in self.fields:
                    if not field_name.startswith(key_a[0:3]): # If field_name doesn't start with first 3 characters of key_a, hide it.
                        self.fields[field_name].widget = forms.HiddenInput()
                        print("__init__ args", kwargs)
                    else:
                        self.fields[field_name].required = True                
                        self.fields['slug'].initial = key_b
                  
            else:
                print("All fields Hidden")

Функция 'get_form' возвращает экземпляр формы. Чтобы инициировать форму, 'get_form_kwargs' необходим для привязки вашей формы к экземпляру вашей модели. Даже если вы создаете новый экземпляр, привязка необходима для создания экземпляра.

Использование 'get_form_kwargs()' является правильным способом добавления дополнительного аргумента к форме.

Вернуться на верх