如何验证用户身份

7
我已经创建了两种不同类型的用户 - 货车和公司。这是我的用户注册页面:enter image description here 注册后,关于用户是货车还是公司的数据将会存储在数据库中。
在我的登录页面LoginPage中,只需要输入电子邮件和密码。在我的自定义用户创建表单中,我添加了字段用户名 = 电子邮件。
当我尝试使用有效凭据登录时,页面没有重定向到特定的用户类型页面。相反,在login.html中,我为无效凭证创建了一个错误提示:“您的电子邮件和密码不匹配,请重试。”
下面是我的代码:
views.py:
def login_view(request):
title = "Login"

if request.method == 'POST':

    form = LoginForm(data=request.POST)
    email = request.POST.get('email', '')
    password = request.POST.get('password', '')
    user = auth.authenticate(username=email, password=password)
    if form.is_valid():
        auth.login(request, user)
        user_type = form.cleaned_data['Label']
        if user.is_active & user_type == 'Truck':
            return HttpResponseRedirect('/post_load/')
        elif user_type == 'Company':
            return HttpResponseRedirect('/live_deal/')
else:
    form = LoginForm()

return render(request, 'registration/login.html', {'form' : form, 'title': title})

urls.py:

# url(r'^login/$', views.login_view),
# url(r'^accounts/login/$', views.login_view),
url(r'^login/$', 'django.contrib.auth.views.login', {'authentication_form': LoginForm}),
url(r'^accounts/login/$', 'django.contrib.auth.views.login', {'authentication_form': LoginForm}),

forms.py:

class LoginForm(auth.forms.AuthenticationForm):

email = forms.EmailField(label=_("Email"),widget=forms.EmailInput)
CHOICES= (('Truck', 'Truck'),('Company', 'Company'),)
Label = forms.ChoiceField(choices=CHOICES, label='Label', widget=forms.RadioSelect())

login.html:

{%extends "registration/header.html"%}
{% block content %}
{% if form.errors %}
<p>Your email and password didn't match. Please try again.</p>
{% endif %}

<form class="form-horizontal" method="post" action = "." >{%csrf_token%}
<div class="panel panel-default login">
        <div class="panel-heading">
            <span class="glyphicon glyphicon-lock"></span> Login</div>
        <div class="panel-body">
            <form class="form-horizontal" role="form">
            <div class="form-group">
                <div class='col-sm-6 col-sm-offset-4'>
                <table border="0">
                <div class="col-sm-4"> 

    <tr><th><label for="id_user" class="col-sm-4 control-label">Email:</label></th><td>{{ form.email }}</td></tr> </div>
    <div class="col-sm-4"> 



    <tr><th><label for="id_password" class="col-sm-4 control-label">Password:</label></th><td>{{ form.password }}</td></tr> </div> 

</table> </div>
                </div>
            </div>
            <div class="form-group">
                <div class="col-sm-offset-4 col-sm-8">
                    <div class="checkbox">
                        <label>
                            <input type="checkbox"/>
                            Remember me
                        </label>
                    </div>
                </div>
            </div>
            <div class="form-group last">
                <div class="col-sm-offset-4 col-sm-8">
                    <button type="submit" class="btn btn-success btn-sm">
                        Sign in</button>
                    <input type="hidden" name="next" value="/" /> 
                        <label class="col-sm-offset-3">
                 <a href="#">Forget Password? </a>
            </label> 
                </div>
            </div>
            </form>
        </div>
        <div class="panel-footer">
            Not Registered? <a href="/register/">Register</a></div>

</div>
</form>
{% endblock %}

阅读错误缩进的Python代码相当困难。 - acidjunk
我是否应该通过简要描述来提供有关我的代码的信息? - vanam
1个回答

9
{% if form.errors %}
<p>Your email and password didn't match. Please try again.</p>

这个错误比较宽泛。你可以循环遍历来查看实际的错误。

更好的方法是,不要使用自己的身份验证系统,而是使用Django内置的系统,它还允许您向用户模型添加额外的字段。

示例:

from django.contrib.auth import authenticate, login

def my_view(request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(username=username, password=password)
    if user is not None:
        if user.is_active:
            login(request, user)
            # Redirect to a success page.
        else:
            # Return a 'disabled account' error message
            ...
    else:
        # Return an 'invalid login' error message.
        ...

请注意,您无需编写自己的登录视图,也可以使用Django的登录系统来处理表单、密码重置/更改、URL和模板(您可以使用自己的模板进行覆盖):

URL:

urlpatterns = [
    url('^', include('django.contrib.auth.urls')),
]

那么,/login/将成为您的登录页面。

在与Django contrib auth模块配合使用后,您可以使用自己的自定义HTML登录表单进行扩展。

django.contrib.auth.views


谢谢您的友好回答。但是,在登录后,我想根据用户类型将用户重定向到特定页面。因此,我在我的login_view中创建了一个user_type并尝试实现这一点。请问我该如何在my_views中实现呢? - vanam
当使用第一个示例时,您可以设置重定向,因为您可以访问用户变量。当使用第二种方法时,您可以通过信号进行操作,或从您配置为主页的视图触发重定向。 - acidjunk
如果我使用自己的用户表怎么办!! - Ayoub Benayache
有几种方法可以自定义用户或使用您自己的用户类:https://docs.djangoproject.com/en/2.2/topics/auth/customizing/ - acidjunk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接