作者简介:Java、前端、Python开发多年,做过高程,项目经理,架构师
主要内容:Java项目开发、毕业设计开发、面试技术整理、最新技术分享
收藏点赞不迷路 关注作者有好处
文末获得源码
目录
三,开发用户管理功能模块
本章节主要实现对用户信息的增删改查操作,结合前所学知识和基础案例,用户登录后完成对用户信息的增加、查询、修改和删除操作。并实现用户查询的分页操作。
3.1 用户查询
views.py中定义查询列表接口方法:
#用户列表查询
def userlist(request):
#查询所有的用户
userlist = UserInfo.objects.all()
return render(request,"userlist.html",{"userlist":userlist})
urls.py中定义路由配置:
path("userlist/",views.userlist),
定义userlist.html页面:
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户列表</title>
<script src="{% static 'js/bootstrap.js'%}"></script>
<script src="{% static 'js/jquery-3.3.1.js'%}"></script>
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}"></link>
</head>
<body>
<p align="center">
<span align="center">
<a href="/touseradd">添加用户</a>
</span>
</p>
<table class="table table-striped">
<thead>
<th>用户编号</th>
<th>账户</th>
<th>密码</th>
<th>年龄</th>
<th>操作</th>
</thead>
<tbody>
{% for user in userlist %}
<tr>
<td>{{user.id}}</td>
<td>{{user.name}}</td>
<td>{{user.password}}</td>
<td>{{user.age}}</td>
<td><a href="/touserupdate?id={{user.id}}">编辑</a>--<a href="/userDel?id={{user.id}}">删除</a></td>
</tr>
{% endfor %}
</tbody>
</table>
</body>
</html>
在此页面中可以通过路由连接添加页面,更新页面,并直接访问删除路由进行用户信息删除。
3.2 用户添加
在views.py中添加跳转到添加页面的路由函数:
#用户添加页面
def touseradd(request):
return render(request,"useradd.html")
在urls.py中定义路由配置:
path("touseradd/",views.touseradd),
开发useradd.html页面:
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户添加</title>
<script src="{% static 'js/bootstrap.js'%}"></script>
<script src="{% static 'js/jquery-3.3.1.js'%}"></script>
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}"></link>
</head>
<body>
<div align="center" style="font-size: 24px">
用户添加页面
</div>
<hr>
<form name="useraddform" method="post" action="/useradd/">
{% csrf_token %}
<table class=".table" align="center">
<tr>
<td>用户名:<input type="text" name="name" class="form-control"></td>
</tr>
<tr>
<td>密码:<input type="password" name="password" class="form-control"></td>
</tr>
<tr>
<td>年龄:<input type="text" name="age" class="form-control"></td>
</tr>
<tr>
<td><input type="submit" value="添加"></td>
</tr>
</table>
</form>
</body>
</html>
注: 1.post请求的提交url指定时,后面必须加一个 /, action="/useradd/" 2.必须添加 {% csrf_token %} django项目中默认对POST请求进行了csrf认证,只需要在模板提交数据的代码块中加入模板标签{{% vsrf_token %}}即可,(不需要注销seetings.py配置文件MIDDLEWARE列表中的'django.middleware.csrf.CsrfViewMiddleware',),模板页面在渲染时会自动在相应位置渲染成隐藏的input标签:<input type="hidden" name="csrfmiddlewaretoken" value="8J4z1wiUEXt0gJSN59dLMnktrXFW0hv7m4d40Mtl37D7vJZfrxLir9L3jSTDjtG8">每次都是随机的
在views.py中添加用户的函数:
#用户添加
def useradd(request):
name = request.POST.get("name")
password = request.POST.get("password")
age = request.POST.get("age")
UserInfo.objects.create(name=name,password=password,age=age)
#重新查询所有的用户
userlist = UserInfo.objects.all()
return render(request,"userlist.html",{"userlist":userlist})
在urls.py中定义路由配置:
path("useradd/",views.useradd),
3.3 用户修改
用户修改应该是先查询数据进行页面回显,再执行数据更新操作。
在views.py中定义跳转更新页面的函数:此函数中先根据所传参数ID查询用户信息并携带到用户更新页面
#用户更新页面
def touserupdate(request):
id = request.GET.get("id")
user = UserInfo.objects.filter(id=id).first()
return render(request,"userupdate.html",{"user":user})
在urls.py中定义路由配置:
path("touserupdate/",views.touserupdate),
定义用户更新页面:
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户更新</title>
<script src="{% static 'js/bootstrap.js'%}"></script>
<script src="{% static 'js/jquery-3.3.1.js'%}"></script>
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}"></link>
</head>
<body>
<div align="center" style="font-size: 24px">
用户更新页面
</div>
<hr>
<form name="useraddform" method="post" action="/userupdate/">
{% csrf_token %}
<table class=".table" align="center">
<input type="hidden" name="id" value="{{user.id}}">
<tr>
<td>用户名:<input type="text" name="name" class="form-control" value="{{user.name}}"></td>
</tr>
<tr>
<td>密码:<input type="password" name="password" class="form-control" value="{{user.password}}"></td>
</tr>
<tr>
<td>年龄:<input type="text" name="age" class="form-control" value="{{user.age}}"></td>
</tr>
<tr>
<td><input type="submit" value="添加"></td>
</tr>
</table>
</form>
</body>
</html>
在 views.py中定义执行更新的函数:更新后重新查询所有用户进入用户列表
#用户信息更新
def userupdate(request):
name = request.POST.get("name")
password = request.POST.get("password")
age = request.POST.get("age")
id = request.POST.get("id")
#根据ID执行更新
UserInfo.objects.filter(id=id).update(name=name,password=password,age=age)
#重新查询所有的用户
userlist = UserInfo.objects.all()
return render(request,"userlist.html",{"userlist":userlist})
在urls.py中定义路由配置:
path("userupdate/",views.userupdate)
3.4 用户删除
在用户列表页面中直接请求用户删除接口,并将用户ID传入执行删除即可。
在views.py中定义执行用户删除的函数:
#用户删除
def userDel(request):
id = request.GET.get("id")
UserInfo.objects.filter(id=id).delete()
#重新查询所有的用户
userlist = UserInfo.objects.all()
return render(request,"userlist.html",{"userlist":userlist})
在urls.py中定义路由配置:
path("userDel/",views.userDel),
至此整个用户管理的增删改查操作案例开发完毕。下面升级一下,实现用户列表分页查询。
3.5 用户列表分页
Django提供了一些类实现管理数据分页,这些类位于django/core/paginator.py中
Paginator对象
Paginator(列表,int):返回分页对象,参数1为要进行分页的列表数据,每面数据的条数(Limit) 属性 count:对象总数 num_pages:页面总数 page_range:页码列表,从1开始,例如[1, 2, 3, 4] 方法 page(num):下标以1开始,如果提供的页码不存在,抛出InvalidPage异常 异常exception InvalidPage:当向page()传入一个无效的页码时抛出 PageNotAnInteger:当向page()传入一个不是整数的值时抛出 EmptyPage:当向page()提供一个有效值,但是那个页面上没有任何对象时抛出
Page对象
创建对象 Paginator对象的page()方法返回Page对象,不需要手动构造 属性 object_list:当前页上所有对象的列表 number:当前页的序号,从1开始 paginator:当前page对象相关的Paginator对象 方法 has_next():如果有下一页返回True has_previous():如果有上一页返回True has_other_pages():如果有上一页或下一页返回True next_page_number():返回下一页的页码,如果下一页不存在,抛出InvalidPage异常 previous_page_number():返回上一页的页码,如果上一页不存在,抛出InvalidPage异常 len():返回当前页面对象的个数 迭代页面对象:访问当前页面中的每个对象
修改用户查询列表函数:userlist
from django.core.paginator import Paginator
#用户列表查询
def userlist(request):
page = request.GET.get("page")
print("page....",page)
if page is None:
page = 1
try:
current_page = int(page)
except:
page = 1
#查询所有的用户
userlist = UserInfo.objects.all()
# 分页器
paginator = Paginator(userlist, 5)
# 当前分页对象
page = paginator.page(current_page)
print(page)
print(page.object_list) # 当前页要展示的数据
# django3.2以后提供了一个页码生成器
page_range = paginator.get_elided_page_range(current_page,on_each_side=3,on_ends=3)
print(page_range)
return render(request,"userlist.html",{"page":page})
修改用户列表页面:userlist.html
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>用户列表</title>
<script src="{% static 'js/bootstrap.js'%}"></script>
<script src="{% static 'js/jquery-3.3.1.js'%}"></script>
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}"></link>
</head>
<body>
<p align="center">
<span align="center">
<a href="/touseradd">添加用户</a>
</span>
</p>
<table class="table table-striped">
<thead>
<th>用户编号</th>
<th>账户</th>
<th>密码</th>
<th>年龄</th>
<th>操作</th>
</thead>
<tbody>
{% for user in page.object_list %}
<tr>
<td>{{user.id}}</td>
<td>{{user.name}}</td>
<td>{{user.password}}</td>
<td>{{user.age}}</td>
<td><a href="/touserupdate?id={{user.id}}">编辑</a>--<a href="/userDel?id={{user.id}}">删除</a></td>
</tr>
{% endfor %}
</tbody>
</table>
<p>
{% for item in page_range %}
<a href="{{ item }}">{{ item }}</a>
{% endfor %}
</p>
<p align="center">
{% if page.has_previous %}
<a href="?page=1">首页</a>
<a href="?page={{ page.previous_page_number }}">上一页</a>
<a href="?page={{ page.previous_page_number }}">{{ page.previous_page_number }}</a>
{% endif %}
<a>{{ page.number }}</a>
{% if page.has_next %}
<a href="?page={{ page.next_page_number }}">{{ page.next_page_number }}</a>
<a href="?page={{ page.next_page_number }}">下一页</a>
<a href="?page={{ page.paginator.num_pages }}">尾页</a>
{% endif %}
</p>
</body>
</html>
实现效果: