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ď č. 1Zdá 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