2

我使用一个视图中创建Django的新用户。然后我有另一个视图来登录他们。新用户无法登录。Django的

但是,当我创建一个用户,并尝试使用身份验证(username = username_post,password = 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

您没有一个名为“密码”字段中表单 - 你只需要“密码1”和“密码2” - 所以没有被保存到模型对象的实际密码字段。所以,当你做self.object.set_password(self.object.password),你实际上是设置密码为空。

相反,你应该从你的窗体的密码1字段中的值:

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

你说得对,我也不会,如果不是你的帮助注意到。我只是使用'form.cleaned_data ['password1']'没有'self'。现在它的工作很完美 – JPYamamoto