【问题标题】:When a form clean() method detects an error, how do I redisplay empty fields instead of the user's input?当表单 clean() 方法检测到错误时,如何重新显示空字段而不是用户的输入?
【发布时间】:2011-10-09 15:01:22
【问题描述】:

当我的 Django 表单的 clean() 方法检测到错误时,我希望表单字段重新显示为空,而不是填写用户提供的任何输入。

我该怎么做?它是表单字段本身的属性,还是在 clean() 方法中完成的?我尝试操作 self.cleaned_data['fieldname'],但没有奏效。

谢谢!

【问题讨论】:

    标签: django forms validation


    【解决方案1】:

    您需要在您的 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
    

    【讨论】:

    • 我试过了,得到了这个错误信息:这个 QueryDict 实例是不可变的
    • 嗨@John,我添加了使用 Django 1.3 和 Python 2.7.2 对我有用的示例代码
    • 我使用的是 Django 1.1,所以也许这就是原因。
    • 另外,您的示例使用特定于字段的 clean 方法,而不是通用的 clean()。也许这就是原因?
    • 我新建了一个 virtualenv 并安装了 Django 1.1.4,这是我最早可以从 Django 站点下载的,代码对我有用。
    猜你喜欢
    • 2021-01-20
    • 1970-01-01
    • 1970-01-01
    • 2022-07-08
    • 2016-04-29
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 2020-05-29
    相关资源
    最近更新 更多