如何在自定义UserChangeForm中覆盖django的用户名唯一性错误消息

8 投票
3 回答
8110 浏览
提问于 2025-04-17 21:23

我正在尝试修改默认的错误提示信息,当我在自定义的 UserChangeForm 表单中输入一个已经存在的用户名时,系统会显示“A user with that Username already exists.”的错误信息。使用的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',)

但是,如果我输入一个已经存在的用户名,这段代码仍然会显示默认的“A user with that Username already exists.”信息。需要注意的是,当我输入一个错误的用户名(包含无效字符)时,自定义的“My message for invalid”信息是会显示出来的。

3 个回答

3

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

class MyForm(forms.ModelForm):

    class Meta:
        model = MyModel
        error_messages = {
            'my_unique_field': {
                'unique': 'not a snowflake after all'
            },
        }
5

根据alecxe的回答,我在我的表单中创建了一个自定义的验证方法:

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方法,它是从现有的 UserCreationForm表单中拿来的,我在里面添加了一个检查,用来和当前用户的用户名进行比较。

5

目前,unique(唯一性)错误信息不能在表单字段层面进行自定义,引用自文档

class CharField(**kwargs)

...

错误信息键:required(必填),max_length(最大长度),min_length(最小长度)

...

class RegexField(**kwargs)

...

错误信息键:required(必填),invalid(无效)

所以,总结一下,对于你的username字段,只有required(必填)、invalid(无效)、max_length(最大长度)、min_length(最小长度)这些错误信息可以自定义。

你只能在模型字段层面设置unique错误信息(见源代码)。

还可以查看相关的问题单

另外,看看django.contrib.auth.forms.UserCreationForm是怎么制作的(注意自定义的duplicate_username错误信息)——自定义错误信息对你来说也是一个选择。

希望这些信息对你有帮助。

撰写回答