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

旧时模样 提交于 2019-12-30 04:48:26

问题


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. Django version used: 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).


回答1:


Currently unique error message cannot be customized on a form field level, quote from docs:

class CharField(**kwargs)

...

Error message keys: required, max_length, min_length

...

class 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.

You can only set unique error message on a model field level (see source).

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.

Hope that helps.




回答2:


According to alecxe's answer, I ended up creating a custom validation method in my form:

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.




回答3:


at the moment it is possible to override the unique error message at the form level:

class MyForm(forms.ModelForm):

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


来源:https://stackoverflow.com/questions/22264368/how-to-override-django-unique-error-message-for-username-in-custom-userchangef

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!