python - 将 Django UserCreationForm 的密码验证错误从密码 2 移至密码 1

标签 python django ajax validation inheritance

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

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

令我困惑的是,密码2/确认字段中出现了与密码相关的错误(例如太短、常见的密码...)。这是默认行为的屏幕截图: 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 发送错误,因此我改为调用祖 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/

相关文章:

python - Django "Running migrations": django. db.utils.OperationalError : (2013, 'Lost connection to MySQL server during query' 期间出错)

python - 无法使用 python 3.7 启动 pipenv

python - Django - 成功登录后将用户重定向到 "next"参数

javascript - Ajax 调用返回 SyntaxError : Unexpected end of input

javascript - 在 HTML 表中显示 JSON 字符串数据

python - Pandas tz_localize : Infer dst when localizing timezone in data with duplicates

python - 直接在生产中部署带有 H2O 算法的 Python 代码,无需 MOJO 和 POJO

python - 将多索引名称转换为 DataFrame 列值并重命名 DataFrame 列

python - django 一对多关系

javascript - 如何循环遍历多个json数组并显示结果