【问题标题】:Moving password validation errors for Django UserCreationForm, from password2, to password1将 Django UserCreationForm 的密码验证错误从密码 2 移至密码 1
【发布时间】:2021-04-27 23:28:00
【问题描述】:

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

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

让我感到困惑的是,与密码有关的错误(例如,密码太短、通用密码...)出现在密码 2 / 确认字段中。这是默认行为的屏幕截图:

从用户体验的角度来看,我觉得在表单中的第一个密码字段出现错误会更有用,因此用户可以调整那个,然后在下面再次输入确认。

我注意到在UserCreationForm 中,clean_password2() 实际上并没有验证密码,它只是检查密码1 和密码2 是否匹配。然后在 _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,并让它验证并将错误发送到密码 2,所以我改为调用祖父母 (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 的错误是什么意思吗?任何建议将不胜感激!

【问题讨论】:

  • 你试过你的解决方案了吗?你有什么?错误?意外行为?
  • 是的,我有,而且它似乎有效,我只是想获得其他意见和建议 - 有时可能存在您在表面/最初没有注意到的问题。

标签: python django ajax validation inheritance


【解决方案1】:
  • 当您想要重写方法时,最好查看您想要重写的方法的文档。
  • 在大多数情况下,当覆盖默认方法时,*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

做事的顺序也很重要,因为它可能有副作用或错误。无论如何,这取决于方法。

这样想:

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

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

A.您正在更改密码验证(仅更改 fontend 行为)。不管是password1 还是password2,都不会影响任何事情,因为两个密码都会匹配并发送到后端。所以是的,在这种情况下完全没问题。 self 会引用UserCreationForm,所以不会影响其他 ModelForm 实例。

【讨论】:

  • 感谢您的安慰 :-) 我在 ModelForm(而不是默认的 UserCreationForm)上调用 super 以避免在密码 2 上发生验证。这发生在 UserCreationForm 中,而不是 ModelForm 中。我刚刚尝试了您发送的代码,现在我收到了两个密码字段的错误消息。我只想向他们展示密码 1。
  • 你尝试过modelform吗?结果是什么?您还会指定错误吗
  • 当我在原始帖子中执行 super(forms.ModelForm, self)._post_clean() 时,我得到了所需的行为。 (仅密码 1 的验证错误)。当我使用您发送的代码时,我收到密码 1 和密码 2 的相同验证错误。对不起,我应该说得更清楚。这些错误是意料之中的,我只想将它们显示为密码 1。我确实用我的原始代码实现了这一点,我只是想检查一下不会有副作用。
  • 修改了答案。 Self 将参考 UserCreationForm。所以,是的,它不会影响任何其他 ModelForm 实例。
  • 请您对此声明进行澄清:“在大多数情况下,当覆盖默认方法时,*args, **kwargs 会产生更高的影响。”?
猜你喜欢
  • 2013-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-23
  • 2013-09-18
  • 2015-04-03
相关资源
最近更新 更多