2

我创建了两种不同类型的用户 - 卡车&公司。这里是我的用户注册页面enter image description here如何验证用户

注册后,有关用户是卡车还是公司的数据将转到数据库。

在我的登录页面,LoginPage

只有电子邮件和密码将被输入。在我的自定义用户创建表单中,我添加了字段username = email。

当我尝试使用有效凭据登录时,该页面不会根据用户类型将其重定向到特定页面。相反,我在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 %} 
+0

这是相当困难读不正确缩进Python代码 – acidjunk

+0

我应该简要介绍提供有关我的代码的任何信息? – vanam

回答

0
{% 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和模板(您可以用自己的模板覆盖):

网址:

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

然后/login/将是你的登录页面。

它与Django contrib auth模块一起使用后,使用您自己的自定义HTML登录表单进行扩展。

django.contrib.auth.views

+0

谢谢你的回答。但是,登录后,我想根据user_type将用户重定向到特定页面。所以,我在我的login_view中创建了一个user_type并试图做到这一点。我如何在my_views中做到这一点。 – vanam

+0

使用第一个示例时,您可以设置重定向,因为您可以访问用户变量。使用第二种方法时;你可以用信号做到这一点,或触发你配置为家的视图中的重定向。 – acidjunk