Когда метод формы clean () обнаруживает ошибку, как я могу снова отобразить пустые поля вместо ввода пользователя? - PullRequest
1 голос
/ 20 июля 2011

Когда метод clean () моей формы Django обнаруживает ошибку, я бы хотел, чтобы поля формы отображались как пустые, а не заполняли ввод, предоставленный пользователем.

Как мне это сделать?Это свойство самого поля формы или это делается методом clean ()?Я пытался манипулировать self.cleaned_data ['fieldname'], но это не сработало.

Спасибо!

1 Ответ

2 голосов
/ 20 июля 2011

Вам необходимо установить атрибут данных поля в '' в вашем чистом методе:

class MyForm(forms.Form):
    name = forms.CharField(max_length=50)

    def clean_name(self):
        name = self.cleaned_data['name']
        if name == 'Bob':
            raise forms.ValidationError(u'Name cannot be "Bob"')
            self.data['name'] = ''
        return name

Надеюсь, что вам это поможет.

[Редактировать]

Вот расширенный пример, который работает для меня в Django 1.3.

#models.py
from django.db import models

class ContactRequest(models.Model):
    name = models.CharField(max_length=100)
    email = models.EmailField()
    subject = models.CharField(max_length=255)
    message = models.TextField()
    response_returned = models.BooleanField(default=False)

    def __unicode__(self):
        return self.name


#forms.py
class ContactRequestForm(forms.ModelForm):
    class Meta:
        model = ContactRequest
        exclude = ('response_returned',)

    def clean_email(self):
        email = self.cleaned_data['email']
        if email != 'test@test.com':
            self.data['email'] = ''
            raise forms.ValidationError(u'Email is not test@test.com')
        return email

[Edit] Вот дополнительный пример, который очищает все поля, если условие не выполняется в чистом методе.Это работает для меня в Django 1.1.4.

#forms.py
from django import forms

class ContactForm(forms.Form):
    name = forms.CharField(max_length=50)
    email = forms.EmailField()

    def clean(self):
        cleaned_data = self.cleaned_data
        name = cleaned_data.get('name')
        email = cleaned_data.get('email')

        if email == 'test@test.com' and name == 'test':
            for k, _ in self.fields.iteritems():
                self.data[k] = ''
            raise forms.ValidationError(u'Email cannot be "test@test.com" and name cannot be "test"')
        return cleaned_data
...