Django表单和字段验证不起作用?

时间:2014-11-16 16:03:24

标签: django validation

使用Django内置Form类时,验证例程似乎不起作用。 表单只包含firstname和lastname。 Firstname是必需的,出于测试目的,我检查lastname是否是Smith并引发异常。当我违反这些要求时没有任何反应,即无例外 - 在提交表单后,定义的操作(POSTunion/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

1 个答案:

答案 0 :(得分:1)

您的表单应该提交给自己。这意味着,如果表单位于/union/contact/,您应该POST/union/contact/。目前,您已将其提交到其他视图/网址。

问题出现了,因为您的表单处理发生在FormView,而不是success_url()。您需要POST到实际负责表单验证的视图(在这种情况下,您是ContactView /union/contact/)。

作为旁注,最好修改表单的操作以使用{% url 'your_form_url_name' %},而不是将url硬编码到模板中。