2017-12-31 18 views
0

私は独自のカスタムユーザーモデルを使用していますが、django.contrib.authユーザーモデルを継承しています。私はユーザー名、電子メール、およびパスワードフィールドを持っています。パスワードフィールドを明示的に追加するのではなく、継承によってデフォルトで追加されるためです。コマンドラインからスーパーユーザーを作成しようとすると、通常のデフォルトのDjangoパスワード検証が正しく機能しています。しかし、私がサインアップフォームを持っているとき、そうではありません。送信をクリックするとメールとユーザー名の確認が正しく機能していますが、パスワードの検証はありません。私は欲しいものを入力することができ、それはパスワードを受け入れるだろう。Djangoのパスワード検証が機能しない

は、ここに私のforms.py

class RegisterForm(forms.ModelForm): 
    class Meta: 
     model = User 
     fields = ['username', 'email', 'password'] 

    username = forms.CharField(label='Username', widget=forms.TextInput(attrs={'placeholder': 'Username:'})) 
    email  = forms.EmailField(label='Email', widget=forms.EmailInput(attrs={'placeholder': 'Email:'})) 
    password = forms.CharField(label='Password', widget=forms.PasswordInput(attrs={'placeholder': 'Password:'})) 

は、ここに私の見解だだ:

class RegisterView(SuccessMessageMixin, View): 
    form_class = RegisterForm 
    template_name = 'oauth/auth_form.html' 
    success_message = "You have successfully created an account!" 

    # Display blank form 
    def get(self, request): 
     form = self.form_class(None) 
     return render(request, self.template_name, {'form': form}) 

    def post(self, request): 
     form = self.form_class(request.POST) 

     if form.is_valid(): 
      user = form.save(commit=False) # Do not save to table yet 

      username = form.cleaned_data['username'] 
      password = form.cleaned_data['password'] 

      user.set_password(password) 
      user.save() 

      # Let's try to login the user 
      user = authenticate(username=username, password=password) 

      if user is not None: 

        login(request, user) 
        return redirect('profiles: index') 

     return render(request, self.template_name, {'form': form}) 

パスワードフィールドはジャンゴからデフォルトのパスワード検証で正しく検証されますように、私はそれを作ることができますどのように?

答えて

1

Djangoはintegrate password validationにいくつかのutilsを持っています。最も簡単には、特定の分野では、フォームのclean_password方法をvalidate_password関数を呼び出すことであろうが、あなたは、いくつかのバリデータのためのユーザーインスタンスを必要とするので、私は、ビューでその使用を実証しなければならない:

from django.contrib.auth.password_validation import validate_password 
from django.core.exceptions import ValidationError 

class RegisterView(SuccessMessageMixin, View): 
    # ... 
    def post(self, request): 

     if form.is_valid(): 
      user = form.save(commit=False) # Do not save to table yet 
      username = form.cleaned_data['username'] 
      password = form.cleaned_data['password'] 

      try: 
       validate_password(password, user) 
      except ValidationError as e: 
       form.add_error('password', e) # to be displayed with the field's errors 
       return render(request, self.template_name, {'form': form}) 
      # ... 

     return render(request, self.template_name, {'form': form})