使用电子邮件或用户名登录django(自定义用户模型)
我是django的新手。我希望该用户能够登录使用用户名或电子邮件。我使用的是自定义用户模型。注册页面工作正常,但在登录时,提交登录数据时,我收到错误 我的代码不起作用。我不知道如何使它正常工作。如果有人能帮助你正常工作,请告诉我。谢谢 //views.py使用电子邮件或用户名登录django(自定义用户模型),django,django-2.1,django-login,django-custom-user,Django,Django 2.1,Django Login,Django Custom User,我是django的新手。我希望该用户能够登录使用用户名或电子邮件。我使用的是自定义用户模型。注册页面工作正常,但在登录时,提交登录数据时,我收到错误 我的代码不起作用。我不知道如何使它正常工作。如果有人能帮助你正常工作,请告诉我。谢谢 //views.py from django.shortcuts import render from .forms import UserCreationForm,UserLoginForm from django.http import HttpRespons
from django.shortcuts import render
from .forms import UserCreationForm,UserLoginForm
from django.http import HttpResponseRedirect
from django.contrib.auth import login,get_user_model, logout,authenticate
# Create your views here.
def base(request):
return render(request, 'articles/base.html')
def login(request,*args,**kwargs):
form=UserLoginForm(request.POST or None)
if form.is_valid():
user_obj=form.cleaned_data.get('user_obj')
print(user_obj)
username = user_obj['query']
password = user_obj['password']
user = authenticate(username=username, password=password)
if user is not None:
print("in login")
login(request, user)
return HttpResponseRedirect('/')
else:
return render(request, 'login1.html', {'form': form})
return render(request, 'articles/login1.html',{'form':form})
//forms.py
from django import forms
from django.contrib.auth import get_user_model
from django.db.models import Q
from django.contrib.auth import get_user_model
User=get_user_model()
class UserCreationForm(forms.ModelForm):
password1 = forms.CharField(label='Password', widget=forms.PasswordInput)
password2 = forms.CharField(label='Password confirmation', widget=forms.PasswordInput)
class Meta:
model=User
fields=['username','email']
def clean_password(self):
# Check that the two password entries match
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
if password1 and password2 and password1 != password2:
raise forms.ValidationError("Passwords don't match")
return password2
def save(self, commit=True):
# Save the provided password in hashed format
user = super(UserCreationForm, self).save(commit=False)
user.set_password(self.cleaned_data["password1"])
if commit:
user.save()
return user
class UserLoginForm(forms.Form):
query=forms.CharField(label='Username/Email')
password=forms.CharField(label='Password',widget=forms.PasswordInput)
def clean(self,*args,**kwargs):
query=self.cleaned_data.get('query')
password=self.cleaned_data.get('password')
user_qs_final=User.objects.filter(
Q(username__iexact=query)|
Q(email__iexact=query)
).distinct()
if not user_qs_final.exists() and user_qs_final!=1:
raise forms.ValidationError("Invalid credentials-user does not exits")
user_obj=user_qs_final.first()
if not user_obj.check_password(password):
raise forms.ValidationError("credential are wrong")
self.cleaned_data["user_obj"]=user_obj
return super(UserLoginForm,self).clean(*args,**kwargs)
目前我遇到了这个错误
TypeError: 'User' object is not subscriptable
问题在于如何在
login
方法中访问用户对象上的字段:
def login(request,*args,**kwargs):
form=UserLoginForm(request.POST or None)
if form.is_valid():
user_obj=form.cleaned_data.get('user_obj')
print(user_obj)
# username = user_obj['query']
# password = user_obj['password']
username = user_obj.username
password = user_obj.password
user = authenticate(username=username, password=password)
if user is not None:
print("in login")
login(request, user)
return HttpResponseRedirect('/')
else:
return render(request, 'login1.html', {'form': form})
return render(request, 'articles/login1.html',{'form':form})
访问模型的字段值时,请使用
而不是[]
问题在于如何在登录
方法中访问用户对象上的字段:
def login(request,*args,**kwargs):
form=UserLoginForm(request.POST or None)
if form.is_valid():
user_obj=form.cleaned_data.get('user_obj')
print(user_obj)
# username = user_obj['query']
# password = user_obj['password']
username = user_obj.username
password = user_obj.password
user = authenticate(username=username, password=password)
if user is not None:
print("in login")
login(request, user)
return HttpResponseRedirect('/')
else:
return render(request, 'login1.html', {'form': form})
return render(request, 'articles/login1.html',{'form':form})
访问模型的字段值时,请使用
而不是[]
谢谢您的帮助。。。。。但即使在正确放置凭据后,它也会重定向到登录页面而不是主页。。。。如果用户不是None,请帮我:打印(“登录中”)登录(请求,用户)返回HttpResponseRedirect(“/”)我想这个代码不起作用。谢谢你的帮助。。。。。但即使在正确放置凭据后,它也会重定向到登录页面而不是主页。。。。如果用户不是None,请帮我:打印(“登录中”)登录(请求,用户)返回HttpResponseRedirect(“/”)我认为这段代码不起作用,我不明白在你的UserLoginForm
中这段代码怎么不会崩溃。在clean方法中,您应该始终首先调用super().clean()方法来填充cleaned_数据
,然后运行您自己的验证。您执行cleaned_data=self().clean()
然后操作cleaned_data
并返回cleaned_data
。我不明白这在UserLoginForm
中如何不崩溃。在clean方法中,您应该始终首先调用super().clean()方法来填充cleaned_数据
,然后运行您自己的验证。执行cleaned_data=self().clean()
然后操作cleaned_data
并返回cleaned_data
。