Django:我如何通过电子邮件而不是用户名登录

ajsxfq5m  于 2023-03-13  发布在  Go
关注(0)|答案(1)|浏览(153)

我想把电子邮件设置在django应用程序的前端。
1.我创建了这个类来进行基于电子邮件的身份验证

class EmailBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        UserModel = get_user_model()
        try:
            user = UserModel.objects.get(email=username)
        except UserModel.DoesNotExist:
            return None
        else:
            if user.check_password(password):
                return user
        return None

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

1.然后我必须在settings.py中定义这个类的路径
1.一切都很好,没有错误,我登录时输入了电子邮件。但在前端,标签仍然是“用户名”。我该如何修改它?

下面是Html代码form登录页面:

<form method="POST">
            {% csrf_token %} <!--this protect our form against certeain attacks ,added security django rquires-->
            <fieldset class="form-group">
              {{ form|crispy}} 
            </fieldset>
            <div class="form-group">
                <button class="btn btn-outline-info" type="submit">Login</button>
                <small class="test-muted ml-2">
                   <a class="ml-2" href="{% url 'password_reset' %}">Forgot Password?</a>
                </small> 
            </div>
            <!--- put div for a link if he is already have account--->
            <div class="border-top pt-3">
                <small class="test-muted">Need an account? <a class="ml-2" href="{% url 'register' %}">Sign Up</a></small> 
                <!--it a bootstrap -->
            </div>
        </form>

已编辑:这是视图代码:

def login_view(request):
    
    context = {}
    user = request.user  
    destination = get_redirect_if_exists(request)

    if request.method == "POST":
        form = LoginForm(request.POST)
        if form.is_valid():
            email = form.cleaned_data["email"]
            password = form.cleaned_data["password"]
            user = authenticate(request, email=email, password=password)
            if user == None:
                attempt = request.session.get("attempt") or 0
                request.session['attempt'] = attempt + 1
                return render(request, 'pages/login.html')
            else:
                login(request, user)
                destination = get_redirect_if_exists(request)
                if destination:
                    return redirect(destination)
                return redirect("home")
    return render(request, 'pages/login.html')

这是登录表单代码:

class LoginForm(UserCreationForm):
    email = forms.CharField(label='email')
    password = forms.CharField(label='password')
6yt4nkrj

6yt4nkrj1#

也许你该换个姿势

urlpatterns = [
   path('login/', LoginView.as_view(authentication_form=YourForm), name='login'),
]

class YourForm(AuthenticationForm):
    username = forms.CharField(widget=TextInput(attrs={'class':'validate','placeholder': 'Username or Email'}))
    password = forms.CharField(widget=PasswordInput(attrs={'placeholder':'Password'})

相关问题