/ / Форми Джанго: як підтвердити, якщо два поля однакові, наприклад електронна пошта або пароль? - python, django, validation, django-forms

Форми Джанго: як підтвердити, якщо два поля однакові, наприклад електронна пошта або пароль? - python, django, validation, django-forms

Я використав відповідні повідомлення SO та Django документи, не можу отримати його на роботу. Моя форма:

from django import forms

class SignUpForm(forms.Form):
(...)
email              = forms.EmailField(max_length=50)
email_conf         = forms.EmailField(max_length=50)

def clean(self):
form_data = self.cleaned_data

if form_data["email"] != form_data["email_conf"]:
self._errors["email_conf"] = "Emails do not match."   # attempt A
self.add_error("email", "Emails do not match.")       # attempt B
raise forms.ValidationError("Emails do not match.")   # attempt C
return form_data

Якщо електронні листи не збігаються, я б хотів, щоб Джанго використовував мій рядок повідомлення таким же чином, як і інші перевірки - як <li> елемент <ul class="errorlist"> під полем "email_conf".

З трьох спроб вище, єдиний, який, здається, робить щось, є #A, але повідомлення вставляється в {{ form.email_conf.errors }} шаблон як звичайний рядок (не як елемент списку).

Два інших спроби нічого не роблять, і в усіх випадках, якщо одне поле порожнє, Django тепер кидає KeyError.

Хотів би знати, що є правильним способом досягнення результату, який я після. Дякую!

Відповіді:

2 для відповіді № 1

Схоже, ви повинні використовувати метод error_class форми, як у прикладі тут. Також ви повинні видалити елемент "email_conf"from cleaned_data dict. Також дуже важливо переконатися, що всі ключі присутні в очищених даних (що ці ключі перевірені на попередніх етапах перевірки).

def clean(self):
cleaned_data = super(SignUpForm, self).clean()
email = cleaned_data.get("email")
email_conf = cleaned_data.get("email_conf")

if email and email_conf and email != email_conf:
self._errors["email_conf"] = self.error_class(["Emails do not match."])
del self.cleaned_data["email_conf"]
return cleaned_data