2017-02-27 3 views
1

Djangoフォームでは、ユーザーにユーザー名を入力させています。フィールドがそうのようなものです:正しい検証エラーを表示するためにDjangoフォームを操作する

username = forms.RegexField(max_length=50,regex=re.compile('^[\[email protected]+-]+$'),\ 
     error_messages={'invalid': _("(tip: only use alphabets, numbers or @ _ . + - symbols)")}) 

その後、clean_username方法では、私はまた、ユーザーがユーザー名でwhtiespaceが含まれていなかったことを確認する必要があります。空白の前の正規表現チェックに失敗するので

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*のような正規表現に失敗したユーザ名を書いた場合、関連するエラーを表示することで妥協したくありません。

この問題を解決するにはどうすればよいですか?説明的な例が素晴らしいでしょう。ありがとう!

答えて

2

ので、代わりの私はおそらくCharFieldと最初にして唯一の空白の問題を扱い、空白のチェックが渡された場合、正規表現をチェックし、フィールド用にカスタマイズclean -method、となるだろうどちらかRegexFieldを使用。

または私は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='^[\[email protected]+-]+$', 
      message='Only use valid chars ...' 
     ) 
    ] 
) 
+0

ありがとうアリー。そうです、私はそう思っていました。しかし、一つの明確化が必要でした: 'RegexField'を' CharField'に置き換えることによって何かを失うでしょうか?とにかく、RegexvalidationがCharFieldで簡単に呼び出せれば、なぜRegexFieldというイベントが存在するのですか?私はこれが私のアプリの認証フローに関連しているので、ここでは余計に注意しようとしています。予期しない何かに噛まれたくない。 'RegexField'の公式文書はかなり良性のようです。 –

+0

'RegexField'のソースを確認することができます:https://github.com/django/django/blob/master/django/forms/fields.py#L493 正規表現を渡すよりもそれほど多くはありませんフィールドに定義されているバリデータをバリデータに渡します。 – arie

関連する問題