/ / Django Forms: Ako overiť, či sú dve polia rovnaké, napr. e-mail alebo heslo? - python, django, validácia, django-formy

Formuláre Django: Ako overiť, či sú dve polia rovnaké, napr. e-mail alebo heslo? - python, django, validácia, django-formy

Odhalil som súvisiace príspevky SO a Django dokumenty, nemôžem to do práce dostať.Moja forma:

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

Ak sa e-maily nezhodujú, chcel by som, aby Django používal môj reťazec správ rovnakým spôsobom ako jeho ostatné potvrdenia - ako <li> element of <ul class="errorlist"> v poli "email_conf".

Z troch vyššie uvedených pokusov, jediný, ktorý skutočne vyzerá, že niečo urobí, je #A, ale správa je vložená do priečinka {{ form.email_conf.errors }} šablónu ako obyčajný reťazec (nie ako položka zoznamu).

Ostatné dva pokusy nič nerobia a vo všetkých prípadoch, ak je jedno pole prázdne, Django teraz hodí KeyError.

By rád vedel, čo je správny spôsob, ako dosiahnuť výsledok, ktorý som po. Vďaka!

odpovede:

2 pre odpoveď č. 1

Zdá sa, že by ste mali použiť metódu error_class formulára, ako v príklade tu, Tiež by ste mali vymazať element "email_conf"z dict. Je tiež veľmi dôležité, aby sa uistili všetky kľúče, ktoré sa nachádzajú v čistených údajoch (tieto kľúče boli validované v predchádzajúcich krokoch validácie).

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