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