个人博客,欢迎查看:https://blog.starmeow.cn/
Github地址:https://github.com/xyliurui/DjangoCRM
登录登出功能
登录
创建login.html
访问 https://v3.bootcss.com/examples/signin/ 另存网页,将文件夹Signin Template for Bootstrap_files中的样式移动到项目static对应目录,重命名Signin Template for Bootstrap.html为login.html后放在templates目录下,进行修改
首先修改base.html,并创建css(放在前部分</head>
上方)和js(放在后部分</body>
上方)的块
{% block css %}{% endblock %}
{% block js %}{% endblock %}
然后修改login.html,记得添加{% csrf_token %}
{% extends 'base.html' %}
{% load static %}
{% block css %}
<link href="{% static 'css/signin.css' %}" rel="stylesheet">
{% endblock %}
{% block body %}
<div class="container">
<form class="form-signin" method="post">
<h2 class="form-signin-heading">请登录</h2>
<label for="inputName" class="sr-only">用户名</label>
<input type="text" id="inputName" name="username" class="form-control" placeholder="用户名" required="" autofocus="">
<label for="inputPassword" class="sr-only">密码</label>
<input type="password" id="inputPassword" name="password" class="form-control" placeholder="密码" required="">
<div class="checkbox">
<label>
<input type="checkbox" value="remember-me"> 记住我
</label>
</div>
{% csrf_token %}
<button class="btn btn-lg btn-primary btn-block" type="submit">登录</button>
</form>
</div> <!-- /container -->
{% endblock %}
创建登录视图
在项目中DjangoCRM目录下创建安views.py文件,和主urls.py在同一级
image.png然后创建登录函数user_login,建议不要使用login,会和系统的函数冲突造成各类问题
from django.shortcuts import render
def user_login(request):
return render(request, 'login.html')
创建登录url
修改主urls.py增加登录url
from .views import user_login
urlpatterns = [
path('admin/', admin.site.urls),
path('crm/', include('crm.urls', namespace='crm')),
path('login/', user_login, name='user_login'), # 用户登录
]
然后访问 http://127.0.0.1:8000/login/ 即会出现登录界面
image.png验证登录功能
修改DjangoCRM目录中的user_login函数
from django.shortcuts import render, redirect, reverse
from django.contrib.auth import authenticate, login
def user_login(request):
if request.method == 'POST':
username = request.POST.get('username', None)
password = request.POST.get('password', None)
# 验证帐密
user = authenticate(username=username, password=password)
if user:
# 登录并生成session
login(request, user)
return redirect(reverse('crm:index'))
return render(request, 'login.html')
登录用户显示
修改base.html模板,增加顶部登录用户的显示,在模板中使用request.user.is_authenticated
来判断用户是否登录,如果已登录就显示用户名那个
<ul class="nav navbar-nav navbar-right">
<li><a href="#">功能一</a></li>
<li><a href="#">功能二</a></li>
{% if request.user.is_authenticated %}
<li><a href="#">{{ request.user }}</a></li>
{% else %}
<li><a href="{% url 'user_login' %}">点击登录</a></li>
{% endif %}
</ul>
登出
创建登出视图
在DjangoCRM目录的views.py中创建退出登录视图
from django.contrib.auth import authenticate, login, logout
def user_logout(request):
logout(request)
return redirect(reverse('user_login'))
创建登出url
修改主urls,增加登出url
from .views import user_login, user_logout
urlpatterns = [
path('admin/', admin.site.urls),
path('crm/', include('crm.urls', namespace='crm')),
path('login/', user_login, name='user_login'), # 用户登录
path('logout/', user_logout, name='user_logout'), # 退出登录
]
登出后回到登录界面
登录用户及登出顶部显示
访问 https://v3.bootcss.com/examples/navbar-static-top/ 查看网页源码,复制导航条下拉菜单功能区
image.png修改base.html下拉导航
<ul class="nav navbar-nav navbar-right">
<li><a href="#">功能一</a></li>
<li><a href="#">功能二</a></li>
{% if request.user.is_authenticated %}
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">{{ request.user }}<span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">用户信息</a></li>
<li role="separator" class="divider"></li>
<li class="dropdown-header">当前用户:{{ request.user }}</li>
<li><a href="{% url 'user_logout' %}">退出登录</a></li>
</ul>
</li>
{% else %}
<li><a href="{% url 'user_login' %}">点击登录</a></li>
{% endif %}
</ul>
image.png
image.png
用户未登录,显示点击登录链接,登陆后,显示用户名和退出登录。
登录错误消息提示
修改login.html错误提示标签
在密码框下方增加p标签,用于显示帐密输入错误的提示信息
<p style="color: coral">{{ login_msg }}</p>
增加user_login登录视图消息
def user_login(request):
login_msg = ''
if request.method == 'POST':
username = request.POST.get('username', None)
password = request.POST.get('password', None)
# 验证帐密
user = authenticate(username=username, password=password)
if user:
# 登录并生成session
login(request, user)
return redirect(reverse('crm:index'))
login_msg = '用户名或密码错误!'
return render(request, 'login.html', locals())
image.png
要求视图登录才能访问
添加login_required装饰器
有的页面只有登录后才能访问,在视图上方添加login_required
装饰器
from django.shortcuts import render
from django.contrib.auth.decorators import login_required
@login_required
def index(request):
return render(request, 'crm/index.html')
settings中设置LOGIN_URL
settings中设置如果没登录访问跳转的地方
当访问 http://127.0.0.1:8000/crm/ 就会跳转到 http://127.0.0.1:8000/accounts/login/?next=/crm/ 改链接无法使用的,需要自定义登录URL
在settings中添加
# 如果没有登录,指定登录url
from django.urls import reverse_lazy
LOGIN_URL = reverse_lazy('user_login')
会自动跳转到 http://127.0.0.1:8000/login/?next=/crm/
获取next值跳转
修改user_login视图,request.GET.get('next')
def user_login(request):
login_msg = ''
if request.method == 'POST':
username = request.POST.get('username', None)
password = request.POST.get('password', None)
next_url = request.GET.get('next')
# 验证帐密
user = authenticate(username=username, password=password)
if user:
# 登录并生成session
login(request, user)
if next_url:
return redirect(next_url)
return redirect(reverse('crm:index'))
login_msg = '用户名或密码错误!'
return render(request, 'login.html', locals())
网友评论