【问题标题】:How to override django 'unique' error message for username in custom UserChangeForm如何在自定义 UserChangeForm 中覆盖用户名的 django 'unique' 错误消息
【发布时间】:2014-03-08 02:50:01
【问题描述】:

我正在尝试覆盖默认的“具有该用户名的用户已经存在”。在我的自定义 UserChangeForm 表单中输入现有用户名时显示错误消息。使用的 Django 版本:1.6.1

这是我的代码:

class CustomUserChangeForm(forms.ModelForm):
    username = forms.RegexField(
        label="User name", max_length=30, regex=r"^[\w.@+-]+$",
        error_messages={
            'invalid': ("My message for invalid"),
            'unique': ("My message for unique") # <- THIS
        }
    )

    class Meta:
        model = get_user_model()
        fields = ('username', 'first_name', 'last_name', 'email',)

但是,如果我使用此代码输入现有用户名,我仍然会得到默认的“具有该用户名的用户已经存在”。信息。请注意,输入错误的用户名(带有无效字符)时会显示自定义的“我的无效消息”。

【问题讨论】:

    标签: python django django-forms


    【解决方案1】:

    目前unique的错误信息无法在表单域级别自定义,引用自docs:

    类 CharField(**kwargs)

    ...

    错误消息键:必需、max_length、min_length

    ...

    类 RegexField(**kwargs)

    ...

    错误消息键:必需,无效

    因此,总而言之,对于您的 username 字段,required、invalid、max_length、min_length 错误消息是可自定义的。

    您只能在模型字段级别设置unique 错误消息(请参阅source)。

    另见相关ticket。

    还可以查看django.contrib.auth.forms.UserCreationForm 是如何制作的(注意自定义duplicate_username 错误消息)- 自定义错误消息也可能是您的一个选项。

    希望对您有所帮助。

    【讨论】:

      【解决方案2】:

      根据alecxe's answer,我最终在我的表单中创建了一个自定义验证方法:

      class CustomUserChangeForm(forms.ModelForm):
          error_messages = {
              'duplicate_username': ("My message for unique")
          }
      
          username = forms.RegexField(
              label="User name", max_length=30, regex=r"^[\w.@+-]+$",
              error_messages={
                  'invalid': ("My message for invalid")
              }
          )
      
          class Meta:
              model = get_user_model()
              fields = ['username', 'first_name', 'last_name', 'email']
      
          def clean_username(self):
              # Since User.username is unique, this check is redundant,
              # but it sets a nicer error message than the ORM. See #13147.
              username = self.cleaned_data["username"]
              if self.instance.username == username:
                  return username
              try:
                  User._default_manager.get(username=username)
              except User.DoesNotExist:
                  return username
              raise forms.ValidationError(
                  self.error_messages['duplicate_username'],
                  code='duplicate_username',
              )
      

      查看clean_username 方法,取自the existing UserCreationForm 表单,我添加了一个检查以与当前用户的用户名进行比较。

      【讨论】:

      • 很好 - 我认为这是更改消息的最干净的方式。
      【解决方案3】:

      目前可以在表单级别覆盖unique 错误消息:

      class MyForm(forms.ModelForm):
      
          class Meta:
              model = MyModel
              error_messages = {
                  'my_unique_field': {
                      'unique': 'not a snowflake after all'
                  },
              }
      

      【讨论】:

        猜你喜欢
        • 2019-08-18
        • 2011-04-28
        • 2011-07-15
        • 2018-12-28
        • 1970-01-01
        • 2012-02-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多