Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 新用户可以';我不能登录。德扬戈_Python_Django_Python 3.x_Authentication_Django Class Based Views - Fatal编程技术网

Python 新用户可以';我不能登录。德扬戈

Python 新用户可以';我不能登录。德扬戈,python,django,python-3.x,authentication,django-class-based-views,Python,Django,Python 3.x,Authentication,Django Class Based Views,我正在使用视图在Django中创建新用户。然后我有另一个视图来登录它们 但是当我创建一个用户,并尝试使用authenticate(username=username\u post,password=password\u post)登录时,我没有得到任何结果,因此它会显示在模板“error username或password”中 在我的数据库中,每次创建新用户时都会看到新的寄存器。但是,由于密码是加密的,我不能说问题是登录视图还是注册视图 然而,在我第一次安装django之后,我通过命令行创建的超

我正在使用视图在Django中创建新用户。然后我有另一个视图来登录它们

但是当我创建一个用户,并尝试使用authenticate(username=username\u post,password=password\u post)登录时,我没有得到任何结果,因此它会显示在模板“error username或password”中

在我的数据库中,每次创建新用户时都会看到新的寄存器。但是,由于密码是加密的,我不能说问题是登录视图还是注册视图

然而,在我第一次安装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')

如果您需要更多信息,请告诉我。

您的表单中没有名为“password”的字段-您只有“password1”和“password2”-因此没有任何内容保存到模型对象的实际密码字段中。因此,当您执行self.object.set_password(self.object.password)时,实际上是在设置一个空白密码

相反,您应该从表单的password1字段中获取值:

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

你是对的,如果没有你的帮助,我是不会注意到的。我刚刚使用了
form.cleaned_data['password1']
而没有
self
。现在它工作得很好