这里我要使用电子邮件或用户名和密码组合登录用户。我已经编写了此代码。但是此代码仅适用于用户名和密码。我在app文件夹中添加了backends.py文件,但此文件不是我可以在使用此代码登录时启用电子邮件功能。有人可以帮助我编辑此代码吗?
异常类型:TypeError
异常值:
EmailAuthBackend()不接受任何参数
views.py
HashHandler
forms.py
from students.backends import EmailAuthBackend as authenticate
def loginuser(request):
if request.method == "POST":
form = LoginForm(request.POST)
username = form['username'].value()
password = form['password'].value()
user = authenticate(username=username, password=password) # here from where i have to import authenticate.
if user and user.is_superuser:
login(request, user)
redirect_url = request.GET.get('next', 'students:home')
messages.info(request, 'You are logged in as an admin .')
return redirect(redirect_url)
elif user and user.is_staff:
login(request, user)
redirect_url = request.GET.get('next', 'students:home')
messages.info(request, 'You are logged in as a staff member.')
return redirect(redirect_url)
elif user and not user.is_active:
messages.info(request, 'Your account is not active.')
else:
messages.error(request,'Invalid Username and Password')
else:
form = LoginForm()
return render(request, 'students/login.html', {'form': form})
模板
class RegisterForm(UserCreationForm):
def clean_email(self):
email = self.cleaned_data['email']
if User.objects.filter(email=email).exists():
raise ValidationError('Email Already Exists')
return email
class Meta:
model = User
fields = ['username', "email", "password1", "password2",'is_superuser','is_staff','is_active']
class LoginForm(forms.Form):
username = forms.CharField()
password = forms.CharField(widget=forms.PasswordInput)
backends.py
<form method="post" class="form-signin">
{% csrf_token %}
Username or Email:<input type="text" name="username" class="form-control mb-2" placeholder="Username or Email" >
Password:<input type="password" name="password" class="form-control mb-2" placeholder="Password" >
<button class="btn btn-lg btn-primary btn-block mb-20" type="submit">Log in</button>
<center><b><a href="{% url 'students:password_reset' %}" class="small">Forgot Password ?</a></b></center>
</form>
settings.py
from django.contrib.auth.backends import ModelBackend
from django.contrib.auth.models import User
class EmailAuthBackend(ModelBackend):
def authenticate(self, username=None, password=None,**kwargs):
try:
user = User.objects.get(email=username)
if user.check_password(password):
return user
except User.DoesNotExist:
try:
user = User.objects.get(username=username)
if user.check_password(password):
return user
except User.DoesNotExist:
return None
def get_user(self, user_id):
try:
return User.objects.get(pk=user_id)
except User.DoesNotExist:
return None