【发布时间】: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