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

2024-06-30 16:35:53 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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

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

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

我注意到在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,所以我调用了祖父母(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的错误是什么意思吗?任何建议都将不胜感激


Tags: 方法instanceselfclean密码表单data错误
1条回答
网友
1楼 · 发布于 2024-06-30 16:35:53
  • 当您想要覆盖一个方法时,最好查看您想要覆盖的方法的文档
  • 在大多数情况下,当重写默认方法时,*args, **kwargs将具有更高的影响

在大多数情况下,我们必须确保重写采用args和kwargs的方法时,最常见的错误是参数不匹配*args(参数,ex:def function(1,2,3))和**kwargs(关键字参数,ex:def function(name='sam', age=25))是函数的动态参数。当您在没有*args的情况下定义函数时,**kwargs它有固定数量的输入,这意味着它不能接受比您在函数中定义的更多(或更少)的输入*args是一个元组,{}是一个字典。这里,Read more about *args and **kwargs

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

这样想:

  • 您正在覆盖UserCreationForm,Django默认注册表。这将影响使用注册的任何地方
  • _post_clean(self)属于{},这将影响使用django注册的任何地方

您的编辑将如何影响默认行为

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

相关问题 更多 >