2017-12-31 17 views
0

내 자신의 사용자 정의 사용자 모델을 사용하고 있지만 django.contrib.auth 사용자 모델을 상속하고 있습니다. 사용자 이름, 전자 메일 및 암호 필드가 있습니다. 암호 필드가 기본적으로 상속에 의해 추가되므로 명시 적으로 암호 필드를 추가하지 않습니다. 명령 줄을 통해 수퍼 유저를 만들려고 할 때 일반적인 기본 Django 비밀번호 유효성 검사가 올바르게 작동합니다. 그러나, 내가 가입 양식을 가지고있을 때, 그것은 아닙니다. 제출을 클릭하면 이메일 및 사용자 이름 유효성 검사가 제대로 작동하지만 비밀번호 유효성 검사가 없습니다. 내가 원하는대로 입력하면 암호를 수락 할 수 있습니다. 암호 필드가 장고에서 기본 암호 검증을 제대로 검증 가도록 (듯이)장고 암호 유효성 검사가 작동하지 않습니다.

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}) 

가 어떻게 그것을 할 수 있습니다 :

여기 내보기의

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:'})) 

여기 내 forms.py입니까?

답변

1

장고에는 integrate password validation에 대한 몇 가지 유틸리티가 있습니다. 가장 쉬운 형태의 분야 특정 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}) 
관련 문제