Я використав відповідні повідомлення 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