操作Django表单以显示正确的验证错误

时间:2017-02-27 20:28:37

标签: django django-forms

在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*),我也不想在显示相关错误时妥协。

解决此问题的最佳方法是什么?一个说明性的例子会很棒。谢谢!

1 个答案:

答案 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 ...'
        )
    ]
)