2014-11-16 6 views
0

При использовании встроенных классов форм Django процедура проверки правильности не работает. Форма состоит просто из имени и фамилии. Первое имя требуется, и для целей тестирования я проверяю, является ли lastname Смитом и вызывает исключение. Когда я нарушаю эти требования ничего не происходит, т. Е. не возникает исключение - после отправки формы определенное действие (POST - union/VIP_best/) просто запускается без какой-либо проверки. Форма называется в union/contact/, направленный от urls.py к views.ContactView.as_view()Форма Django и проверка поля не работают?

Вот моя установка до сих пор:
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 

шаблоны/union/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

Является ли форма на странице '/ union/VIP_best /'? Или другая страница? – rnevius

+0

Спасибо за вопрос. Я добавил эту информацию (форма находится на '/ union/VIP_best /'). –

+1

Ваша форма должна быть самой. Значение, если форма находится на '/ union/contact /', вы должны быть 'POST'ing'/union/contact/' – rnevius

ответ

1

Ваша форма должна подчиняться себе. Значение, если форма находится на /union/contact/, вы должны быть POST ing до /union/contact/. В настоящее время у вас есть представление другого представления/url.

Проблема возникает потому, что ваша обработка формы происходит в FormView, а не на вашем success_url(). Вам необходимо указать POST, который фактически отвечает за проверку формы (в данном случае ваш ContactView по адресу /union/contact/).

В качестве примечания стороны, вероятно, было бы лучше изменить действие формы для использования {% url 'your_form_url_name' %}, в отличие от жесткого кодирования URL-адреса в шаблоне.

Смежные вопросы