Ошибка в 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 шт):

Автор решения: Za Ars

Проблема в том, что 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
→ Ссылка