0

django-registrationと一緒に私のDjango 1.11サイトにa custom user modelがあります。Django 1.11でユーザ名の検証を無効にするにはどうしたらいいですか?

登録フォームに、ユーザー名とパスフレーズを入力するよう求められます。私はMinimumLengthValidatorとカスタムWordCountValidatorバリデーションをsettings.pyのパスフレーズフィールドに追加しました(下記参照)。これらのバリデーションルールは自動的に登録フォームに表示されます。

ここでは、長さは文字で始める必要があり、英数字のみを含めることができます。私はこれらを1つのルールに組み合わせても構いません。

username_validatorをクラスに追加して設定しようとしましたが、何も起こりません。おそらく、私はAbstractUserからユーザ(related 1.10 bug?)を継承しているためです。

私のユーザ名フィールドに自分自身の妥当性検査ルール(マルチセクションが望ましい)を使用するにはどうすればよいですか?

形態の

簡易外観:

Username: [  ] 

Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only. 

Passphrase: [  ] 

Your passphrase must contain at least 15 characters. 
Passphrase must contain at least three words. Use spaces between words. 

Passphrase confirmation: [  ] 

Enter the same passphrase as before, for verification. 

settings.py

AUTH_PASSWORD_VALIDATORS = [ 
    { 
     'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', 
     'OPTIONS': { 
      'min_length': 15, 
     } 
    }, 
    { 
     'NAME': 'custom.validators.WordCountValidator', 
     'OPTIONS': { 
      'min_words': 3, 
     } 
    }, 
] 

models.py

class User(AbstractUser): 
    objects = UserManager() 

    def __init__(self, *args, **kwargs): 

     user = super(User, self).__init__(*args, **kwargs) 
     return user 

    ... 

validators.py

class WordCountValidator(object): 
    ... 

class StartLetterValidator(object): 
    ... 

class AlphanumericValidator(object): 
    ... 

class CombinedValidator(object): 
    ... 

答えて

1

があなたのUserモデルのclean()方法を上書きし、そこにあなたのバリデータを呼び出す:

def clean(self): 
    # do some data-clean 
    # maybe do a super().clean() here 

    validator1 = WordCounterValidator(self) 
    validator1.myValidationMethod() 
    #... 
    validator2 = StartLetterValidator(self) 
    validator2.myValidationMethod() 
    #... 
    validator3 = AlphanumericValidator(self) 
    validator3.myValidationMethod() 
    #... 
    validator4 = CombinedValidator(self) 
    validator4.myValidationMethod() 
    #... 

    # maybe do a super().clean() here 

をお使いの検証コードを簡素化するために、検証メソッドを書く代わりにするために役に立つかもしれません検証クラス。しかし、私は両方のデザインが行うと思います。

更新

による解答の大きさにコメントで質問に対する

拡張答え、:

DjangoはこのためValidationErrorを提供します。あなたは私はあなたのエラーを収集するために辞書を使用することをお勧め一度に複数のValidationError秒を上げたい場合:

err_dict = {} 

を次に単にキーとエラーメッセージとしてフィールド名とその辞書にエラーを追加として値:err_dict["field-name"] = "Error mssg"

clean()の末尾には、エラーがある場合はif err_dict(エラーが[dict]にある場合はtrue)で確認し、raise ValidationError(err_dict)でそれらを引き上げます。あなたのケースでは

あなたerr_dict(必要に応じて)各検証機能を拡張するために

err_dict = validatot1.myValidationMethod(err_dict) 

ような何かをしたい場合があります。

+0

このコンテキストでは、どのように検証エラーが累積されますか? – d3vid

+0

私はあなたの質問に答えるために私の答えを更新しました。 –

関連する問題