Здесь я хочу войти в систему с помощью электронной почты или комбинации имени пользователя и пароля. Я написал этот код. Но этот код работает только для имени пользователя и пароля. Я добавил файл backends.py в папку приложения, но этот файл не работает. Как я могу включить функцию электронной почты при входе с этим кодом. Может ли кто-нибудь помочь мне отредактировать этот код?
Тип исключения: TypeError
Значение исключения:
EmailAuthBackend () не принимает аргументов
views.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})
forms.py
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)
шаблон
<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>
backends.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
settings.py
AUTHENTICATION_BACKENDS = ('students.backends.EmailAuthBackend',)