我有一个 Django 表单类,它继承自内置的 UserCreationForm。
我正在使用 AJAX 提交表单,如果未通过验证,则将绑定(bind)表单(包括错误)作为呈现的 HTML 返回。
令我困惑的是,密码2/确认字段中出现了与密码相关的错误(例如太短、常见的密码...)。这是默认行为的屏幕截图:
从用户体验的角度来看,我觉得表单中第一个密码字段出现错误会更有用,因此用户可以调整该密码,然后通过在下面再次键入来确认它。
我在UserCreationForm中注意到了这一点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 发送错误,因此我改为调用祖 parent (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
是一个字典。在这里,Read more about *args and **kwargs .
做事的顺序也很重要,因为它可能会产生副作用或错误。无论如何,这取决于方法。
这样想:
- 您正在覆盖 Django 默认注册表单
UserCreationForm
。这将影响使用注册的地方。 _post_clean(self)
属于UserCreationForm
,它将影响使用 django 注册的地方。
问。您的编辑将如何影响默认行为?
A.您正在更改密码验证(只是更改字体行为)。无论是password1还是password2,都不会产生任何影响,因为两个密码都会匹配并发送到后端。所以是的,在这种情况下完全没问题。 Self 将引用 UserCreationForm
,因此不会影响其他 ModelForm 实例。
关于python - 将 Django UserCreationForm 的密码验证错误从密码 2 移至密码 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65863073/