Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.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 UserCreationForm的密码验证错误从password2移动到password1_Python_Django_Ajax_Validation_Inheritance - Fatal编程技术网

Python 将Django UserCreationForm的密码验证错误从password2移动到password1

Python 将Django UserCreationForm的密码验证错误从password2移动到password1,python,django,ajax,validation,inheritance,Python,Django,Ajax,Validation,Inheritance,我有一个Django表单类,它继承自内置的UserCreationForm 我正在使用AJAX提交表单,如果绑定表单未验证,则将其作为呈现的HTML返回(包括错误) 令我困惑的是,password2/确认字段中出现了与密码相关的错误(例如,太短、通用密码…)。以下是默认行为的屏幕截图: 从用户体验的角度来看,我觉得如果表单中的第一个密码字段出现错误会更有用,这样用户就可以调整该字段,然后在下面再次键入来确认它 我注意到,在中,clean_password2()实际上并没有验证密码,它只是检查p

我有一个Django表单类,它继承自内置的UserCreationForm

我正在使用AJAX提交表单,如果绑定表单未验证,则将其作为呈现的HTML返回(包括错误)

令我困惑的是,password2/确认字段中出现了与密码相关的错误(例如,太短、通用密码…)。以下是默认行为的屏幕截图:

从用户体验的角度来看,我觉得如果表单中的第一个密码字段出现错误会更有用,这样用户就可以调整该字段,然后在下面再次键入来确认它

我注意到,在中,clean_password2()实际上并没有验证密码,它只是检查password1和password2是否匹配。然后在_post_clean()方法中,验证password2,并将所有错误添加到该字段中

在试图更改它时,我覆盖了_post_clean(),如下所示:

def _post_clean(self):
    super(forms.ModelForm, self)._post_clean()
    password = self.cleaned_data.get('password1')
    if password:
        try:
            password_validation.validate_password(password, self.instance)
        except forms.ValidationError as error:
            self.add_error('password1', error)
我不想调用super,让它验证并将错误发送到password2,所以我调用了祖父母(ModelForm)的post_clean方法(我想!),以避免遗漏任何错误。然后验证错误并将其发送到password1

这是UserCreationForm用于比较的post_clean()方法:

def _post_clean(self):
    super()._post_clean()
    # Validate the password after self.instance is updated with form data
    # by super().
    password = self.cleaned_data.get('password2')
    if password:
        try:
            password_validation.validate_password(password, self.instance)
        except ValidationError as error:
            self.add_error('password2', error)
从表面上看,这似乎是我想要的方式,但当涉及到覆盖方法时,我不是很有信心——我担心会有奇怪的副作用

所以我的问题是,这样可以吗?你知道我想显示password1的错误是什么意思吗?任何建议都将不胜感激

  • 当您想要覆盖一个方法时,最好查看您想要覆盖的方法的文档
  • 在大多数情况下,当重写默认方法时,
    *args、**kwargs
    将产生更大的影响
在大多数情况下,我们必须确保重写采用args和kwargs的方法时,最常见的错误是参数不匹配
*args
(参数,例如:
def function(1,2,3)
)和
**kwargs
(关键字参数,例如:
def function(name='sam',age=25)
)是函数的动态参数。当您在没有
*args
的情况下定义函数时,
**kwargs
具有固定数量的输入,这意味着它不能接受比您在函数中定义的更多(或更少)的输入
*args
是一个元组
**kwargs
是一个字典。这里

同样重要的是,做事的顺序可能会产生副作用或错误。无论如何,这取决于方法

这样想:

  • 您正在覆盖Django默认注册表中的
    UserCreationForm
    。这将影响使用注册的任何地方
  • \u post\u clean(self)
    属于
    用户创建表单
    ,这将影响使用django注册的任何地方
您的编辑将如何影响默认行为


A.您正在更改密码验证(仅更改fontend行为)。无论是password1还是password2,它都不会影响任何内容,因为两个密码都将匹配并发送到后端。因此,是的,在这种情况下完全可以。Self将引用到
UserCreationForm
,因此它不会影响其他ModelForm实例。

您尝试过您的解决方案吗?你有什么?错误?出乎意料的行为?是的,我有,而且它似乎起作用了,我只是想得到其他的意见和建议-有时可能会有一些你在表面上/最初没有注意到的问题。谢谢你的安慰:-)我在ModelForm(而不是默认的UserCreationForm)上调用super是为了避免在password2上发生验证。这在UserCreationForm中发生,但在ModelForm中不发生。我刚刚尝试了您发送的代码,现在我收到了两个密码字段的错误消息。我只想为password1显示它们。您是否尝试了modelform。结果如何?另外,当我执行super(forms.ModelForm,self)时,请指定错误。\u post\u clean()与我最初的帖子一样,我得到了所需的行为。(仅password1的验证错误)。当我使用您发送的代码时,我会收到password1和password2的相同验证错误。对不起,我应该说得更清楚。这些错误是预期的,我只想为password1显示它们。我确实用我的原始代码实现了这一点,我只是想检查是否有副作用。修改了答案。Self将引用到UserCreationForm。因此,是的,它不会影响任何其他ModelForm实例。请您对这句话进行澄清:“在大多数情况下,当重写默认方法时,*args,**kwargs将具有更高的影响。”?