如何在自定义UserChangeForm中覆盖用户名的django'unique'错误消息

时间:2014-03-08 02:50:01

标签: python django django-forms

我正在尝试覆盖默认的“具有该用户名的用户已存在”。在我的自定义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',)

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

3 个答案:

答案 0 :(得分:5)

目前无法在表单字段级别自定义unique错误消息,引自docs

  

类CharField(** kwargs)

     

...

     

错误消息键:required,max_length,min_length

     

...

     

类RegexField(** kwargs)

     

...

     

错误消息键:必填,无效

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

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

另请参阅相关的ticket

另请参阅django.contrib.auth.forms.UserCreationForm是如何制作的(注意自定义duplicate_username错误消息) - 自定义错误消息也是您的选择。

希望有所帮助。

答案 1 :(得分:5)

根据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表单,我在其中添加了一项检查,以便与当前用户的用户名进行比较。

答案 2 :(得分:2)

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

unique