Уведомления

Группа в Telegram: @pythonsu

#1 Июль 27, 2018 22:39:13

Podarok
Зарегистрирован: 2017-08-12
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Кастомная валидация для формы

Есть форма:

 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 (Июль 28, 2018 00:19:36)

Офлайн

#2 Июль 28, 2018 21:22:55

Podarok
Зарегистрирован: 2017-08-12
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Кастомная валидация для формы

Написал так:

 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 (Июль 28, 2018 22:02:41)

Офлайн

#3 Июль 28, 2018 22:14:29

Podarok
Зарегистрирован: 2017-08-12
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Кастомная валидация для формы

После изменений в форме:

 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 (Июль 29, 2018 12:24:06)

Офлайн

#4 Июль 30, 2018 13:07:12

Podarok
Зарегистрирован: 2017-08-12
Сообщения: 21
Репутация: +  0  -
Профиль   Отправить e-mail  

Кастомная валидация для формы

Правильно было так:

 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>
Об этом было написано тут, тут, тут и тут.

Отредактировано Podarok (Июль 30, 2018 13:08:29)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version