使用Django内置Form类时,验证例程似乎不起作用。
表单只包含firstname和lastname。 Firstname是必需的,出于测试目的,我检查lastname是否是Smith并引发异常。当我违反这些要求时没有任何反应,即无例外 - 在提交表单后,定义的操作(POST
到union/VIP_best/
)是只是触发而没有任何验证。该表单在union/contact/
处调用,从urls.py
定向到views.ContactView.as_view()
到目前为止,这是我的设置:
views.py
from union.forms import ContactForm
class ContactView(generic.edit.FormView):
template_name = 'union/contact.html'
form_class = ContactForm
forms.py
from django import forms
from django.core.exceptions import ValidationError
class ContactForm(forms.Form):
firstname = forms.CharField(label='Vorname', max_length=20, required=True, error_messages={'required': 'Please enter first name!'})
lastname = forms.CharField(label='Nachname', max_length=20)
def clean_lastname(self):
data = self.cleaned_data['lastname']
if data != "Smith":
raise forms.ValidationError("Your last name is not Smith.")
else:
raise forms.ValidationError("Your last name is Smith.")
return data
模板/联合/ contact.html
<form action="/union/VIP_best/" method="post">
{% csrf_token %}
{{ form.as_table }}
<tr>
<td><input type="submit" value="Submit"></td>
</tr>
</form>
我缺少什么才能触发.clean()
或.is_valid
?
我是否必须明确呼叫Field.clean()
和is_valid()
?如果是的话,在哪里?
教程和Django文档似乎没有提到任何类似的东西。
Django 1.7,Python 3.4.2
答案 0 :(得分:1)
您的表单应该提交给自己。这意味着,如果表单位于/union/contact/
,您应该POST
到/union/contact/
。目前,您已将其提交到其他视图/网址。
问题出现了,因为您的表单处理发生在FormView
,而不是success_url()
。您需要POST
到实际负责表单验证的视图(在这种情况下,您是ContactView
/union/contact/
)。
作为旁注,最好修改表单的操作以使用{% url 'your_form_url_name' %}
,而不是将url硬编码到模板中。