简体   繁体   English

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

[英]How to override django 'unique' error message for username in custom UserChangeForm

I'm trying to override the default "A user with that Username already exists." 我正在尝试覆盖默认的“具有该用户名的用户已存在”。 error message displayed when entering an existing username in my custom UserChangeForm form. 在我的自定义UserChangeForm表单中输入现有用户名时显示的错误消息。 Django version used: 1.6.1 使用的Django版本:1.6.1

Here's my code : 这是我的代码:

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',)

But if I enter an existing username with this code, I still get the default "A user with that Username already exists." 但是,如果我使用此代码输入现有用户名,我仍然会获得默认“具有该用户名的用户已存在”。 message. 信息。 Note that the custom "My message for invalid" is displayed when entering a wrong username (with invalid characters). 请注意,输入错误的用户名(包含无效字符)时会显示自定义“我的无效邮件”。

Currently unique error message cannot be customized on a form field level, quote from docs : 目前,无法在表单字段级别自定义unique错误消息,引用文档

class CharField(**kwargs) CharField类(** kwargs)

... ...

Error message keys: required, max_length, min_length 错误消息键:required,max_length,min_length

... ...

class RegexField(**kwargs) regexField类(** kwargs)

... ...

Error message keys: required, invalid 错误消息键:必需,无效

So, to summarize, for your username field only required , invalid , max_length , min_length error messages are customizeable. 因此,总而言之,对于仅requiredusername min_length段, invalidmax_lengthmin_length错误消息是可自定义的。

You can only set unique error message on a model field level (see source ). 您只能在模型字段级别上设置unique错误消息(请参阅源代码 )。

Also see relevant ticket . 另见相关

Also see how django.contrib.auth.forms.UserCreationForm was made (pay attention to custom duplicate_username error message) - custom error message could be an option for you too. 另请参阅如何制作django.contrib.auth.forms.UserCreationForm (注意自定义duplicate_username错误消息) - 自定义错误消息也可能是您的选项。

Hope that helps. 希望有所帮助。

According to alecxe's answer , I ended up creating a custom validation method in my form: 根据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',
        )

See the clean_username method, taken from the existing UserCreationForm form to which I added a check to compare with the current user's username. 请参阅clean_username方法,该方法取自现有的 UserCreationForm表单,我在其中添加了一个检查以与当前用户的用户名进行比较。

at the moment it is possible to override the unique error message at the form level: 目前,可以在表单级别覆盖unique错误消息:

class MyForm(forms.ModelForm):

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM