【问题标题】:How to override help_text and label for password form in django如何在 django 中覆盖密码表单的 help_text 和标签
【发布时间】:2020-08-01 23:37:18
【问题描述】:

我的forms.py 中有以下表格。由于某种原因,username 字段 WORKS 和(两者)密码字段的 label 和 help_text 的覆盖都没有。

class CreateUserForm(UserCreationForm):
    class Meta:
        model = User
        fields = ['username', 'password1', 'password2']
        labels = {
            'username': 'My Username Label',
            'password1': 'My Password1 Label',
            'password2': 'My Password2 Label',
        }
        help_texts = {
            'username': 'My username help_text',
            'password1': 'My password1 help_text',
        }

渲染时,默认的 django 标签/help_texts 会显示密码字段:

Your password can’t be too similar to your other personal information.
Your password must contain at least 8 characters.
...

我已经阅读了这些答案,但它们没有帮助:Q1Q2Q3

我也阅读了文档,并且有一条注释here(降低页面的绿色注释)似乎相关,但我不太明白。它提到了以声明方式定义的字段,我没有这样做。也不会解释为什么它适用于username 而不适用于password1

【问题讨论】:

  • 能否分享一下你的模板并查看代码
  • username 是模型上的实际字段,因此 Meta 中的覆盖有效。 password1 是仅在表单上定义的字段,帮助文本是从密码验证设置中设置的验证器生成的。原来的 help_text 有什么问题?

标签: python django django-forms


【解决方案1】:

我也有同样的担忧。我尝试了很多方法,但最好的方法是编写自己的验证器。假设我们想更改错误文本“此密码完全是数字”。换成其他行“پسورد شما کاملا عدد است。لطفا آن را تغییر دهید。”。

假设我的应用在我的项目中是 auth_app

在您的应用中创建 validator.py

import re

from django.core.exceptions import ValidationError
from django.utils.translation import ugettext as _


class CustomNumericPasswordValidator:
    """
    Validate whether the password is alphanumeric.
    """
    def validate(self, password, user=None):
        if password.isdigit():
            raise ValidationError(
                _("پسورد شما کاملا عدد است. لطفا آن را تغییر دهید."),
                code='password_entirely_numeric',
            )

    def get_help_text(self):
        return _('Your password can’t be entirely numeric.')

然后转到 settings.py 并将您的验证器替换为默认值

{
    'NAME': 'auth_app.validators.CustomNumericPasswordValidator',
},

保存并享受更改。

Here is a test to what we defined as new error message

【讨论】:

    【解决方案2】:

    重写表单类的__init__(...)方法,

    class CreateUserForm(UserCreationForm):
        def __init__(self, *args, **kwargs):
            super().__init__(*args, **kwargs)
            self.fields['password1'].label = 'password1 label'
            self.fields['password2'].label = 'password2 label'
    
            self.fields['password1'].help_text = 'password1 help_text'
            self.fields['password2'].help_text = 'password2 help_text'

    【讨论】:

    • 效果很好,谢谢。您介意简要解释一下原因吗?
    • 结帐@schwobaseggl 的comment
    猜你喜欢
    • 2017-07-16
    • 2012-02-14
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 2019-09-25
    • 2013-03-21
    • 2017-02-19
    相关资源
    最近更新 更多