Python 新用户可以';我不能登录。德扬戈
我正在使用视图在Django中创建新用户。然后我有另一个视图来登录它们 但是当我创建一个用户,并尝试使用authenticate(username=username\u post,password=password\u post)登录时,我没有得到任何结果,因此它会显示在模板“error username或password”中 在我的数据库中,每次创建新用户时都会看到新的寄存器。但是,由于密码是加密的,我不能说问题是登录视图还是注册视图 然而,在我第一次安装django之后,我通过命令行创建的超级用户能够毫无问题地登录,因此我认为问题在于创建用户时 以下是我的登录和注册视图: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之后,我通过命令行创建的超
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
。现在它工作得很好