Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 清除表单验证错误上的Django表单字段?_Python_Django_Django Forms - Fatal编程技术网

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

Python 清除表单验证错误上的Django表单字段?,python,django,django-forms,Python,Django,Django Forms,我有一个Django表单,允许用户更改密码。我发现在表单错误上,字段中仍然有*输出的数据是令人困惑的 我尝试了几种方法来删除form.data,但我一直收到一条此QueryDict实例是不可变的异常消息 是否有合适的方法从clean()中清除单个表单字段或整个表单数据集?如果需要使用表单中的多个字段进行额外验证,请重写.clean()方法。但是,如果只针对一个字段,则可以创建一个clean_field_name()方法 我想您需要使用JavaScript来隐藏或删除容器中的文本。有人向我演示了如

我有一个Django表单,允许用户更改密码。我发现在表单错误上,字段中仍然有*输出的数据是令人困惑的

我尝试了几种方法来删除form.data,但我一直收到一条
此QueryDict实例是不可变的
异常消息


是否有合适的方法从
clean()
中清除单个表单字段或整个表单数据集?

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


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

有人向我演示了如何做到这一点。这种方法对我有效:

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

在验证过程中,您不能从表单的已清理数据中删除密码数据吗


请参阅(特别是第二段代码)。

关于不可变的QueryDict错误,您的问题几乎可以肯定是您创建了如下表单实例:

form = MyForm(request.POST)
form = MyForm(request.POST.copy())
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)
这意味着form.data是从POST VAR创建的实际查询信息。因为请求本身是不可变的,所以当您试图更改其中的任何内容时会出现错误。在这种情况下

form.data['field'] = None
是完全一样的事情

request.POST['field'] = None
要获得一个可以修改的表单,您需要如下构造它:

form = MyForm(request.POST)
form = MyForm(request.POST.copy())
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)

我刚刚重新创建了表单

试试看:

form = AwesomeForm()

然后渲染。Django有一个小部件可以:

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

form = MyForm(request.POST)
form = MyForm(request.POST.copy())
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小部件的render方法(而不是我在超级调用中传递的值None)让任何django小部件忘记它的值。

您可以使用javascript,它在95%的情况下都可以工作,如下所示:;示例:Igor,我知道如何验证表单。问题是当验证失败时,我希望表单字段返回空的,而不是用户提供的数据。在我看来,您应该使用clean()方法来验证这两个密码——如果它们不正确,请在引发验证错误之前清除self.data字段。有人能再详细说明一下吗。当我在引发validationError之前尝试self.data['field']=None时,什么都没有发生,甚至没有引发验证错误。肯定有一种方法可以在服务器端完成此操作。。。依靠客户端JavaScript来实现这一点是一个相当混乱的方法。这是可行的,但它不是很干净,因为您是在视图级别进行的。在我看来,您应该对默认登录表单进行子类化,并按照Igor的建议替换clean()方法。也就是说,首先验证它们是否正确;清除相关的self.data字段,最后提出一个ValidationError。有没有可能详细说明?我仍然得到不可变的querydict错误。post_vars.update(request.post)是执行dict(request.post)的一种不太干净的方法。在任何一种情况下,表单提交的值都不会被form.data覆盖,最终会在呈现表单中显示为u“”(但不确定为什么会发生这种情况)。按照@Ian的建议使用request.POST.copy()非常有效。请注意,对于表单中的文件字段或图像字段,您必须以相同的方式设置form.files,而不是form.data。