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 %}