CRM自定义用户登陆
创建一个登陆的页面login.hmtl文件
login.html
{% extends 'base.html'%} {% block body %} <body> <div class="container col-lg-3 col-lg-offset-3"> <form class="form-signin" method="post">{%csrf_token%} <h2 class="form-signin-heading">Please sign in</h2> <!--<label for="inputEmail" class="sr-only">Email address</label>--> <input type="email" id="inputEmail" class="form-control" name="email" placeholder="Email address" required autofocus> <!--<label for="inputPassword" class="sr-only">Password</label>--> <input type="password" id="inputPassword" class="form-control" name="password" placeholder="Password" required> <span style="color: red">{{error.error}} </span> <div class="checkbox"> <label> <input type="checkbox" value="remember-me"> Remember me </label> </div> <button class="btn btn-lg btn-primary btn-block" type="submit">Sign in</button> </form> </div> <!-- /container --> <!-- IE10 viewport hack for Surface/desktop Windows 8 bug --> </body> {% endblock %}
在PerfectCRM/urls.py文件中加入登陆的地址
url(r'^account/login/',views.acc_login,name="acc_login"),
在PerfectCRM/views.py文件中定义一个函数,处理登陆
如果想要是只有登陆了才能直接用url访问页面,得在kind_admin.py文件中的函数前加上@login_required
from django.contrib.auth.decorators import login_required
没有登陆的话直接访问页面,那就返回到登陆页面,登陆之后跳转到刚才想要访问的页面,直接访问页面时会有一个next参数判断这个就好
PerfectCRM/views.py
django自带有用户密码认证的
from django.contrib.auth import login,authenticate,logout user = authenticate(email=_email,password=_password)
django自带的登陆,如果邮箱和密码是匹配的那么user就是email的对象,如果不匹配那么user值就是None
from django.contrib.auth import login,authenticate,logout login(request, user)
如果是直接访问页面的地址如下的地址会直接返回到登陆页,登陆之后才会到他想要的页面:
http://127.0.0.1:8000/account/login/?next=/kind_admin/crm/customer/
获取next的值,post和get的请求方式是共存的
def acc_login(request): """登陆页面""" error={} print("request.POST:",request.POST) if request.method == "POST": _email = request.POST.get("email") print("request.POST.get('email')",_email) _password = request.POST.get("password") print("request.POST.get('password')",_password) user = authenticate(email=_email,password=_password) print("user",user) if user: login(request, user) next_url = request.GET.get("next","/") print("next_url:",next_url) return redirect(next_url) else: error["error"]="email or password wrong" return render(request,"login.html",{"error":error})
登陆之后里面也有一个退出的按钮,点击他会跳转到登陆页面
登出的前端是在table_index.html
<div id="navbar" class="navbar-collapse collapse"> <ul class="nav navbar-nav navbar-right"> <li class="dropdown"> <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="false" aria-expanded="false">{{request.user.name}} <span class="caret"></span></a> <ul class="dropdown-menu" role="menu"> <li><a href="#">配置</a></li> <li><a href="{%url 'acc_logout'%}">退出登陆</a></li> </ul> </li> </ul> </div>
为了admin跳转到那个登陆页面,默认是/accounts/login/可以在Perfectcrm/settings.py文件中设置跳转到的是哪个登陆页面
LOGIN_URL = "/account/login/" #为了admin跳转到那个登陆页面,默认是/accounts/login/
Perfectcrm/urls.py中设置登出的url
url(r'^account/logout/',views.acc_logout,name="acc_logout")
在Perfectcrm/views.py文件中处理登出
django有自带的登出logout函数
from django.contrib.auth import login,authenticate,logout
def acc_logout(request): """退出页面""" logout(request) return redirect("/account/login/")
如果想要出现用户权限页面可以在role表中设置那个用户有什么权限可以展示那些页面
总结:
虽然登陆页面比较简单但是我还是掉进了很简单不应该的坑里面:
1、登陆页面的email、password的输入框,我把这两个值的input的name都写在了其他地方导致我看后端返回的值一直都是None
2、django的登陆认证authenticate,返回的值一直是None,我试了邮箱和密码都是正确的,最后原来是我明明创建用户表的时候是用email和password,但是我认证的时候一直填的是username和password难怪一直不匹配