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()' является правильным способом добавления дополнительного аргумента к форме.