簡體   English   中英

如何在自定義UserChangeForm中覆蓋用戶名的django'unique'錯誤消息

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

我正在嘗試覆蓋默認的“具有該用戶名的用戶已存在”。 在我的自定義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',)

但是,如果我使用此代碼輸入現有用戶名,我仍然會獲得默認“具有該用戶名的用戶已存在”。 信息。 請注意,輸入錯誤的用戶名(包含無效字符)時會顯示自定義“我的無效郵件”。

目前,無法在表單字段級別自定義unique錯誤消息,引用文檔

CharField類(** kwargs)

...

錯誤消息鍵:required,max_length,min_length

...

regexField類(** kwargs)

...

錯誤消息鍵:必需,無效

因此,總而言之,對於僅requiredusername min_length段, invalidmax_lengthmin_length錯誤消息是可自定義的。

您只能在模型字段級別上設置unique錯誤消息(請參閱源代碼 )。

另見相關

另請參閱如何制作django.contrib.auth.forms.UserCreationForm (注意自定義duplicate_username錯誤消息) - 自定義錯誤消息也可能是您的選項。

希望有所幫助。

根據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表單,我在其中添加了一個檢查以與當前用戶的用戶名進行比較。

目前,可以在表單級別覆蓋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