在表单验证错误上清除Django表单字段?

时间:2010-03-01 03:27:49

标签: python django django-forms

我有一个允许用户更改密码的Django表单。我发现字段的表单错误令人困惑,因为它们仍然存在*'ed out数据。

我尝试了几种删除form.data的方法,但我不断收到This QueryDict instance is immutable异常消息。

是否有正确的方法可以从clean()清除单个表单字段或整个表单数据集?

7 个答案:

答案 0 :(得分:6)

关于不可变的QueryDict错误,您的问题几乎肯定是您已经创建了这样的表单实例:

form = MyForm(request.POST)

这意味着form.data 从POST变量创建的实际QueryDict。由于请求本身是不可变的,因此当您尝试更改其中的任何内容时会出现错误。在这种情况下,说

form.data['field'] = None

完全相同
request.POST['field'] = None

要为自己创建一个可以修改的表单,您需要像这样构建它:

form = MyForm(request.POST.copy())

答案 1 :(得分:2)

有人告诉我该怎么做。这种方法对我有用:

post_vars = {}  
post_vars.update(request.POST)  
form = MyForm(post_vars, auto_id='my-form-%s')  
form.data['fieldname'] = ''  
form.data['fieldname2'] = ''

答案 2 :(得分:0)

如果您需要使用表单中的多个字段进行额外验证,请覆盖.clean()方法。但是如果只是一个字段,你可以创建一个clean_field_name()方法。

http://docs.djangoproject.com/en/1.1/ref/forms/validation/#ref-forms-validation

答案 3 :(得分:0)

您不能在验证期间从表单的cleaning_data中删除密码数据吗?

请参阅the Django docs for custom validation(特别是第二段代码)。

答案 4 :(得分:0)

我刚刚再次创建了表单。

试试吧:

form = AwesomeForm()

然后渲染它。

答案 5 :(得分:0)

Django有一个小部件可以做到这一点: https://docs.djangoproject.com/en/1.8/ref/forms/widgets/#passwordinput

现在,如果您不使用密码,可以执行以下操作:

class NonceInput(Input):
    """
    Hidden Input that resets its value after invalid data is entered
    """
    input_type = 'hidden'
    is_hidden = True

    def render(self, name, value, attrs=None):
        return super(NonceInput, self).render(name, None, attrs)

当然你可以让任何django小部件只是通过覆盖它的渲染方法来忘记它的值(而不是我在超级调用中传递None的值。)

答案 6 :(得分:-2)

我想您需要使用JavaScript来隐藏或删除容器中的文本。