2

私はDjangoで新しいユーザーを作成するためにビューを使用しています。新規ユーザーはログインできません。Django

しかし、私はユーザーを作成し、認証(username = username_post、パスワード= password_post)でログインしようとすると、Noneを取得するので、テンプレートに表示されます。 '間違ったユーザー名またはパスワード。'。

私のデータベースでは、新しいユーザーを作成するたびに新しいレジスタが表示されます。しかし、パスワードが暗号化されているので、問題がログインビューかレジスタービューかどうかはわかりません。

しかし、最初にdjangoをインストールした後にコマンドラインから作成したスーパーユーザーは、問題なくログインできるため、ユーザーを作成するときに問題が発生します。

これらは私のログインで、ビューを登録します。

class Login(View): 
    form = LoginForm() 
    message = None 
    template = 'settings/blog_login.html' 

    def get(self, request, *args, **kwargs): 
     if request.user.is_authenticated(): 
      return redirect('settings:index') 
     return render(request, self.template, self.get_context()) 

    def post(self, request, *args, **kwargs): 
     username_post = request.POST['username'] 
     password_post = request.POST['password'] 
     user = authenticate(username=username_post, password=password_post) 
     if user is not None: 
      login(request, user) 
      return redirect('settings:index') 
     else: 
      self.message = 'Wrong username or password.' 
      return render(request, self.template, self.get_context()) 

    def get_context(self): 
     return {'form': self.form, 'message': self.message} 


class Register(CreateView): 
    success_url = reverse_lazy('settings:login') 
    model = User 
    template_name = 'settings/blog_register.html' 
    form_class = RegisterForm 

    def form_valid(self, form): 
     self.object = form.save(commit=False) 
     self.object.set_password(self.object.password) 
     self.object.save() 
     return HttpResponseRedirect(self.get_success_url()) 

そして、これらは私の形である:

class LoginForm(forms.Form): 
    username = forms.CharField(max_length=20, label='Username') 
    password = forms.CharField(label='Password', widget=forms.PasswordInput()) 


class RegisterForm(forms.ModelForm): 
    username = forms.CharField(max_length=20, label='Username') 
    password1 = forms.CharField(label='Password', widget=forms.PasswordInput(), 
           error_messages={'required': 'Required field.', 
               'unique': 'Username already used.', 
               'invalid': 'Not valid username.'}) 
    password2 = forms.CharField(label='Retype password', widget=forms.PasswordInput(), 
           error_messages={'required': 'Required field.'}) 
    email = forms.EmailField(error_messages={'required': 'Required field.', 
              'invalid': 'Invalid email.'}) 

    def clean(self): 
     clean_data = super(RegisterForm, self).clean() 
     password1 = clean_data.get('password1') 
     password2 = clean_data.get('password2') 
     if password1 != password2: 
      raise forms.ValidationError('Passwords are different.') 
     return self.cleaned_data 

    def clean_email(self): 
     email = self.cleaned_data.get('email') 
     username = self.cleaned_data.get('username') 
     if email and User.objects.filter(email=email).exclude(
       username=username).exists(): 
      raise forms.ValidationError('Email already used.') 
     return email 

    class Meta: 
     model = User 
     fields = ('username', 'password1', 'password2', 'email') 

、あなたはより多くの情報が必要な場合は私に知らせてください。

答えて

2

フォームには「パスワード」というフィールドはありません。「password1」と「password2」だけです。モデルオブジェクトの実際のパスワードフィールドには何も保存されません。したがって、self.object.set_password(self.object.password)を実行すると、実際には空白のパスワードを設定しています。それはあなたの助けのためではなかった場合は、右、私は気づいていないだろうしている

self.object.set_password(self.form.cleaned_data['password1']) 
+0

代わりに、あなたはあなたのフォームのパスワード1フィールドから値を取得する必要があります。私は 'form.cleaned_data ['password1']'を 'self 'なしで使用しました。そして、今は完全に動作しています – JPYamamoto

関連する問題