在Django表单中,我让用户输入他们的用户名。这个领域是这样的:
username = forms.RegexField(max_length=50,regex=re.compile('^[\w.@+-]+$'),\
error_messages={'invalid': _("(tip: only use alphabets, numbers or @ _ . + - symbols)")})
稍后,在clean_username
方法中,我还需要确保用户没有在用户名中包含空格。我这样做是这样的:
def clean_username(self):
username = self.cleaned_data['username']
if ' ' in username:
raise ValidationError("(tip: a username can't have whitespaces)")
return username
问题是这个验证错误永远不会出现,因为空格无法通过先前的正则表达式检查。我需要能够分别显示与空白相关的ValidationError。此外,如果用户编写正则表达式失败的用户名(例如Bèndèr*
),我也不想在显示相关错误时妥协。
解决此问题的最佳方法是什么?一个说明性的例子会很棒。谢谢!
答案 0 :(得分:2)
因此,我可能会使用RegexField
和自定义CharField
- 方法来代替使用clean
,而是首先处理空白问题并仅检查正则表达式如果空格检查通过了。
或者我会使用CharField
并首先分配一个custom validator来检查空格,另外还有一个RegexValidator
这些方面的东西:
from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator
def validate_whitespaces(value):
if ' ' in value:
raise ValidationError("Oops, a whitespace error occured.")
username = forms.CharField(
max_length=50,
validators=[
validate_whitespaces,
RegexValidator(
regex='^[\w.@+-]+$',
message='Only use valid chars ...'
)
]
)