Найти - Пользователи
Полная версия: Кастомная валидация для формы
Начало » Django » Кастомная валидация для формы
1
Podarok
Есть форма:
 class RegisterForm(models.Form):
    username = forms.CharField()
    password = forms.CharField()
    password_confirm = forms.CharField()
Нужно написать валидацию, проверяющую password == password_confirm, и встроить ее в форму.
Почитав доки, понял, что валидация должна выглядеть как-то так:
 def valid_password_confirm(password, confirm):
	if password != confirm:
		raise forms.ValidationError("Passwords are different.")
Но как встроить ее в форму?
В доках нашел способ с переопределением метода clean().
Сделал так:
 class RegisterForm(models.Form):
    username = forms.CharField()
    password = forms.CharField()
    password_confirm = forms.CharField()
    def clean(self):
    	cleaned_data = super().clean()
    	valid_password_confirm(
    		cleaned_data["password"],
    		cleaned_data["password_confirm"]
    	)
form.is_valid() стало возвращать False, но никаких подсказок на форме не появляется.
Нужно поведение как у дефолтной валидации, как, например, если бы не проходило условие max_length.
Podarok
Написал так:
 class RegisterForm(models.Form):
    username = forms.CharField()
    password = forms.CharField()
    password_confirm = forms.CharField()
    def clean(self):
    	cleaned_data = super().clean()
    	if cleaned_data["password"] != cleaned_data["password_confirm"]:
    		raise forms.ValidationError("Passwords are different.")
Документация утверждает, что такой код должен выводить сообщение ошибки над формой. У меня же form.is_valid() просто возвращает False и никаких сообщений не выходит.
В чем может быть причина?
Вьюха такая:
 class RegisterView(views.View):
	def post(self, request):
		form = RegisterForm(request.POST)
		if form.is_valid():
			# Сохранение юзера в бд
			return render(request, "register.html", context={"form": form})
register.html:
 <form method="POST">
	{% csrf_token %}
    <div class="form-group">
        {{ form.username.label_tag }}
        {{ form.username }}
    </div>
    <div class="form-group">
        {{ form.password.label_tag }}
        {{ form.password }}
    </div>
    <div class="form-group">
        {{ form.password_confirm.label_tag }}
        {{ form.password_confirm }}
    </div>
</form>
Podarok
После изменений в форме:
 class RegisterForm(models.Form):
    username = forms.CharField()
    password = forms.CharField()
    password_confirm = forms.CharField()
    def clean(self):
    	cleaned_data = super().clean()
    	if cleaned_data["password"] != cleaned_data["password_confirm"]:
    		raise forms.ValidationError("Passwords are different.")
во вьюхе:
 class RegisterView(views.View):
	def post(self, request):
		form = RegisterForm(request.POST)
		if form.is_valid():
			# Сохраниение юзера в бд
			return render(request, "register.html", context={"form": form})
		else:
			render(request, "register.html", context={"form": form})
и в register.html
 <form method="POST">
    {% csrf_token %}
    {{ form }}
    <button type="submit" class="btn btn-default">Submit</button>
</form>
Ошибка все-таки стала появляться сверху формы, но все стили (бутстрап) естественно пропали.

И так:
 if cleaned_data["password"] != cleaned_data["password_confirm"]:
	self.add_error("password_confirm", forms.ValidationError("Passwords are different."))
 <form method="POST">
	{% csrf_token %}
    <div class="form-group">
        {{ form.username.label_tag }}
        {{ form.username }}
    </div>
    <div class="form-group">
        {{ form.password.label_tag }}
        {{ form.password }}
    </div>
    <div class="form-group">
        {{ form.password_confirm.label_tag }}
        {{ form.password_confirm }}
    </div>
    <button type="submit" class="btn btn-default">Submit</button>
</form>
тоже не работает.
Что делать?
Podarok
Правильно было так:
 class RegisterForm(models.Form):
    username = forms.CharField()
    password = forms.CharField()
    password_confirm = forms.CharField()
    def clean(self):
    	cleaned_data = super().clean()
    	if cleaned_data["password"] != cleaned_data["password_confirm"]:
    		raise forms.ValidationError("Passwords are different.")
 class RegisterView(views.View):
	def post(self, request):
		form = RegisterForm(request.POST)
		if form.is_valid():
			# Сохраниение юзера в бд
			return render(request, "register.html", context={"form": form})
		else:
			render(request, "register.html", context={"form": form})
 <form method="POST">
	{% csrf_token %}
	{{ form.non_field_errors }}
    <div class="form-group">
        {{ form.username.label_tag }}
        {{ form.username }}
        {{ form.username.errors }}
    </div>
    <div class="form-group">
        {{ form.password.label_tag }}
        {{ form.password }}
        {{ form.password.errors }}
    </div>
    <div class="form-group">
        {{ form.password_confirm.label_tag }}
        {{ form.password_confirm }}
        {{ form.password_confirm.errors }}
    </div>
    <button type="submit" class="btn btn-default">Submit</button>
</form>
Об этом было написано тут, тут, тут и тут.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB