【发布时间】:2011-10-09 15:01:22
【问题描述】:
当我的 Django 表单的 clean() 方法检测到错误时,我希望表单字段重新显示为空,而不是填写用户提供的任何输入。
我该怎么做?它是表单字段本身的属性,还是在 clean() 方法中完成的?我尝试操作 self.cleaned_data['fieldname'],但没有奏效。
谢谢!
【问题讨论】:
标签: django forms validation
当我的 Django 表单的 clean() 方法检测到错误时,我希望表单字段重新显示为空,而不是填写用户提供的任何输入。
我该怎么做?它是表单字段本身的属性,还是在 clean() 方法中完成的?我尝试操作 self.cleaned_data['fieldname'],但没有奏效。
谢谢!
【问题讨论】:
标签: django forms validation
您需要在您的 clean 方法中将字段的数据属性设置为 '':
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
[编辑] 这是一个附加示例,如果在 clean 方法中不满足条件,则清除所有字段。这在 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
【讨论】: