我有一个允许用户更改密码的Django表单。我发现字段的表单错误令人困惑,因为它们仍然存在*'ed out数据。
我尝试了几种删除form.data的方法,但我不断收到This QueryDict instance is immutable
异常消息。
是否有正确的方法可以从clean()
清除单个表单字段或整个表单数据集?
答案 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来隐藏或删除容器中的文本。