如何在自定义UserChangeForm中覆盖django的用户名唯一性错误消息
我正在尝试修改默认的错误提示信息,当我在自定义的 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 个回答
目前,可以在表单级别覆盖unique
错误信息:
class MyForm(forms.ModelForm):
class Meta:
model = MyModel
error_messages = {
'my_unique_field': {
'unique': 'not a snowflake after all'
},
}
根据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 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
错误信息)——自定义错误信息对你来说也是一个选择。
希望这些信息对你有帮助。