Ошибка в CreateView
RegisterUser работает нормально, а вот при переходе на name='check_code' появляется такая ошибка
__init__() got an unexpected keyword argument 'instance'
Если во вью поменять form_class на, например, RegisterUserForm, то будет работать, то есть проблема, как я понимаю, в форме CheckCodeForm. Но чему там ломаться? Я даже делал ее просто с одним булевым полем и все равно не работает. В чем дело, 2 простые одинаковые вьюхи с формами, но одна работает, другая нет?
Есть такие url:
urlpatterns = [
path('register/', RegisterUser.as_view(), name='register'),
path('register/check_code/', CheckCode.as_view(), name='check_code'),
]
views.py
class RegisterUser(CreateView):
form_class = RegisterUserForm
template_name = 'app_users/register.html'
class CheckCode(CreateView):
form_class = CheckCodeForm
template_name = 'app_users/check_code.html'
forms.py
class RegisterUserForm(UserCreationForm):
username = forms.CharField(label='Логин', widget=forms.TextInput(attrs={'class': 'form-input'}))
email = forms.EmailField(label='Электронная почта', widget=forms.TextInput(attrs={'class': 'form-input'}))
password1 = forms.CharField(label='Пароль', widget=forms.PasswordInput(attrs={'class': 'form-input'}))
password2 = forms.CharField(label='Повтор пароля', widget=forms.PasswordInput(attrs={'class': 'form-input'}))
class Meta:
model = User
fields = ('username', 'email', 'password1', 'password2')
class CheckCodeForm(forms.Form):
code = forms.IntegerField(label='Проверочный код', widget=forms.NumberInput(attrs={'class': 'form-input'}))
Ответы (1 шт):
Проблема в том, что CreateView работает с объектами моделей. И работает она также как и UpdateView.
Вот часть кода, который уснаследывают оба класса.
# src/env/lib/python3.8/site-packages/django/views/generic/edit.py:103
def get_form_kwargs(self):
"""Return the keyword arguments for instantiating the form."""
kwargs = super().get_form_kwargs()
if hasattr(self, 'object'):
kwargs.update({'instance': self.object})
return kwargs
Как можете заметить, в форму передается параметр instance. У вас же форма унаследована от forms.Form, которая не принимает этот параметр.
Решение:
- Делайте форму от
forms.ModelForm - Переопределите свою форму, метод
__init__, чтобы принимал параметрinstance