如何在Django中使用电子邮件/用户名登录?

时间:2019-05-15 09:09:02

标签: django

这里我要使用电子邮件或用户名和密码组合登录用户。我已经编写了此代码。但是此代码仅适用于用户名和密码。我在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

0 个答案:

没有答案
相关问题