ValueError at /accounts/register. Пользователь не может быть создан, потому что данные не прошли валидацию. (django model form)

Я не понимаю, почему может возникнуть эта ошибка. Итак, вот моя очень простая модель пользователя:

from django.db import models
from django.contrib.auth.models import AbstractUser

# Create your models here.
class User(AbstractUser):
    pass

Моя модель формы:

class RegistrationForm(forms.ModelForm):
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
    password2 = forms.CharField(label='Cofirm Password', widget=forms.PasswordInput)

    class Meta:
        model = User
        fields = ('username', 'email')

    def clean_password(self):
        password1 = self.cleaned_data.get("password1")
        password2 = self.cleaned_data.get("password2")
        if password1 and password2 and password1 != password2:
            return False
        return True

    def save(self, commit=True):
        user = super().save(commit=False)
        user.set_password(self.cleaned_data["password1"])
        if commit:
            user.save()
        return user

И мой вид, где я вызываю метод form.save():

class Register(View):
    template = 'application/register.html'
    success_url = 'application:index'

    def get(self, request):
        ctx = {
            'form': RegistrationForm(),
        }
        return render(request, self.template, ctx)

    def post(self, request):
        form = RegistrationForm(request.POST)
        instance = form.save(commit=False)
        if not form.is_valid():
            ctx = {
                'form': RegistrationForm(),
            }
            return render(request, self.template, ctx)
        instance.save()
        login(request, instance)
        return redirect(self.success_url)

Может ли кто-нибудь помочь мне понять, что я сделал неправильно?

Спасибо

Вы не можете запустить instance = form.save(commit=False) перед .is_valid().

Сначала валидируйте форму затем создайте экземпляр User. Я создал маршрут для возврата ошибок, если форма не прошла валидацию.

 def post(self, request):
    form = RegistrationForm(request.POST)
    if form.is_valid():
        instance = form.save()
        login(request, instance)
        return redirect(self.success_url)
    ctx = {
       'form': form,
    }
    return render(request, self.template, ctx)

Но убедитесь, что вы отображаете ошибки в вашем шаблоне. Примером этого может быть:

{% if form.errors %}
    {% for field in form %}
        {% for error in field.errors %}
            <div class="alert alert-danger">
                <strong>{{ error|escape }}</strong>
            </div>
        {% endfor %}
    {% endfor %}
    {% for error in form.non_field_errors %}
        <div class="alert alert-danger">
            <strong>{{ error|escape }}</strong>
        </div>
    {% endfor %}
{% endif %}
Вернуться на верх