Как отобразить ValidationError в шаблоне Django?
Я новичок в Django, и прошу помощи у сообщества.
Сейчас я работаю над регистрацией пользователей и хочу сделать проверку пароля: если пароль не повторяется, то под нижним полем появляется сообщение. Насколько я понимаю, {{ form.errors }}
должен использоваться для вывода текста ошибки, указанного в ValidationError
, но когда эта ошибка возникает, ее текст не выводится на страницу.
Подскажите, пожалуйста, как решить эту проблему. Возможно, я не совсем понял, как работают формы Django.
Я пробовал решения, предложенные в других ответах, но, к сожалению, пока ничего не получилось.
Спасибо.
forms.py:
from .models import CustomUser
class RegisterUserForm(forms.ModelForm):
email = forms.EmailField(required=True,
label="Адрес электронной почты",
widget=forms.EmailInput(attrs={'class': 'form-control',
'placeholder':'email'}))
password = forms.CharField(label='Пароль',
widget=forms.PasswordInput(attrs={'class': 'form-control',
'placeholder':'password'}) )
confirm_password = forms.CharField(label='Пароль(повторно)',
widget=forms.PasswordInput(attrs={'class': 'form-control',
'placeholder':'confirm password'}))
def clean(self):
super().clean()
password = self.cleaned_data['password']
confirm_password = self.cleaned_data['confirm_password']
if password != confirm_password:
raise ValidationError({'confirm_password': 'пароли не совпадают'})
views.py:
def sign_up(request):
if request.method=="POST":
form = RegisterUserForm(request.POST)
if form.is_valid():
form.save()
return redirect('pages:index')
form = RegisterUserForm()
return render(request=request, template_name="users/sign_up.html", context={'form': form})
Шаблон:
</head>
<link rel="stylesheet" type="text/css" href="{% static 'users/css/style.css' %}">
<head>
<div class="text-center log-in-bg rounded">
<img class="mb-4" src="{% static "users/images/logo_sign_in.png" %}" alt="" width="72" height="72">
<h1 class="h3 mb-3 font-weight-normal text-dark">РЕГИСТРАЦИЯ</h1>
<form method="post" class="form-signin">
{% csrf_token %}
{{ form.email.label_tag }}
{{ form.email }}
{{ form.password }}
{{ form.confirm_password }}
{{ form.errors }}
<button class="btn btn-lg btn-sign-in btn-block">Зарегистрироваться</button>
</form>
</div>
Спасибо за помощь. Надеюсь, мой вопрос не слишком примитивен - я только в начале изучения Django, могу не знать некоторых вещей =)
Вариант 1)
Обычно ошибки валидации в clean() появляются в
{{ form.non_field_errors }}
... потому что они не связаны с конкретным полем. В данном случае речь идет о двух полях. Если вы включите вышеуказанное в свой шаблон и измените сообщение об ошибке на...
raise ValidationError('пароли не совпадают')
...тогда ошибка должна появиться на вашей странице.
Вариант 2)
Присмотревшись внимательнее, я вижу, что вы пытались добавить это сообщение об ошибке для поля confirm_password. Хотя это не по умолчанию, если вы хотите обрабатывать это таким образом, вы можете удалить текущие строки raise ValidationError
и использовать следующее в вашем методе clean, чтобы назначить ошибку определенному полю.
self.add_error('confirm_password', 'пароли не совпадают')
Ошибка была в представлении. Это исправленный вид:
def sign_up(request):
if request.method=="POST":
form = RegisterUserForm(request.POST)
if form.is_valid():
form.save()
return redirect('pages:index')
else:
form = RegisterUserForm()
return render(request, template_name="users/sign_up.html", context={'form': form})
Я делал новый запрос к форме. И контекст с ошибками был очищен.
Использование else
помогло мне сохранить этот контекст. С другой стороны ответ SamSparx помог мне понять, как использовать add_error.