Django应用案例:添加用户列表
员工管理系统中有多个菜单模块,之前案例已经将部门管理菜单栏功能实现,现需要实现用户管理菜单栏功能。
1、实现菜单切换
用户管理模块中包含用户列表、添加用户、修改用户和删除用户功能。实现用户管理模块之前,首先需要实现点击菜单切换到不同的菜单模块,具体代码如下图所示。
上述代码在模板文件中设置“部门管理”和“用户管理”两个菜单按钮,其中点击“部门管理”按钮跳转到部门展示页面,点击“用户管理”按钮跳转到用户展示页面,实现菜单模块切换功能。
2、查询所有用户
查询所有用户的操作与查询所有部门的操作一样,使用models.UserInfo.objects.all()函数获取所有用户的对象集,通过遍历对象集从而获取数据对象,然后使用数据对象调用对象字段来获取数据。一些常见类型或者单个表字段可以这样获取,如果获取一些特殊类型(例如:注册时间字段、性别字段)或关联表中的字段,就不能直接调用。
2.1 获取时间类型
直接将时间类型返回给HTML页面,它是以一种默认格式展示,这种展示方式不符合我们对时间认知。所以,为了解决这种情况,一般会将时间转换为指定规则的字符显示。
a.在Python中的的时间转换
在Python转换时间需要导入datetime模块。
from datetime import datetime
使用strftime()函数将时间类型转换为字符类型,返回值为字符串类型。第一个参数为时间类型,第二个参数为转换规则,其中%Y(年)、%m(月)、%d(日)、%H(时)、%M(分)、%S(秒)。
datetime.strftime(d, "%Y-%m-%d %H:%M:%S")
使用strptime()函数将字符类型转换为时间类型,返回值为时间类型。第一个参数为字符串类型,第二个参数为转换规则。strptime()函数第一个参数的字符串必须与第二个参数的规则格式一致。
str = “2022-10-1 8:35:15”
datetime.strftime(str, "%Y-%m-%d %H:%M:%S")
b.在模板中的时间转换
在模板语法中时间转换与Python的语法规范有所不同,模板中需要遵循模板的语法规范,模板具体语法如下。
{{ user.create_time|date:"Y-m-d" }}
其中user.create_time用于获取后台响应的时间类型数据;date:”Y-m-d”用于设置时间转换的规则,它使用以下符号转换对应的时间。
Y(年)、m(月)、d(日)、H(时)、i(分)、s(秒)
2.2 获取性别
性别字段是smallint(最小的类型)类型,其内容为数字,这样做有利于节约表空间。如果直接将性别字段中数据返回给页面,它将显示实际存储的值,这个值并不能使我们知道它具体是什么意思,所以Django中提供“get_字段_display()”函数帮助我们获取值对应的中文意思。要想使用“get_字段_display()”函数,需要定义元组的元组类型(选择字段),然后才能使用该函数,具体操作如下。
第一步:在models.py文件设置字段选择字段。
# 性别字段,为了节约空间,可以将性别字段设置为小整型
# 在choices是Django的代码做的约束,这里表示填写性别时只能写1或2,1代表男,2代表女。
gender_choices = (
(1, "男"),
(2, "女")
)
gender = models.SmallIntegerField(verbose_name='性别', choices=gender_choices)
第二步:根据值获取选择字段中对应的中文。
在views.py文件中使用Python语法来获取。
# 性别
# Django中提供“get_字段_display()”函数,用于获取选择元组的元组中对应Key的中文内容。
gender = obj.get_gender_display()
print(gender)
在HTML文件中,需要使用模板语法来获取。
{# 获取选择元组的元组中对应Key的中文内容,注意:在模板语法中不允许方法后加括号,模板会自动的给方法加上括号 #}
<td>{{ user.get_gender_display }}</td>
2.3 获取部门名
获取关联表中的其它字段数据,使用当前外键的变量名即可。Django生成表时会为外键字段自动加id(如:depart字段,生成表时字段为depart_id),其实depart_id只能获取当前表中的字段内容,而depart表示根据id自动的去关联表中获取的那一行的数据对象。所以,想要获取关联表的其它字段时,使depart对象去调用关联表中的其它字段即可(如:depart.title)。
在views.py文件中,获取关联字段对应的表数据。
title = obj.depart.title
print(title)
在HTML文件中,获取关联字段对应的表数据。
{# 获取关联表其它字段,通过获取外键ID对应的对象来获取 #}
<td>{{ user.depart.title }}</td>
3、查询所有用户源码
3.1 在urls.py文件设置查询用户的URL地址。
# 2、用户管理
path('user/list/', views.user_list),
在菜单模板文件是设置访问查询所有用户的触发链接。
3.2 创建user_list.html文件
在user_list.html文件中创建用户管理页面,实现用户列表、新建用户、编辑用户和删除用户等功能。
{% extends 'menu_template.html' %}
{% block menu %}
{# 列出用户信息 #}
<div class="container">
{# 按钮 #}
<div style="margin-bottom: 10px">
<a href="/depart/add/" class="btn btn-primary">
<span class="glyphicon glyphicon-plus"></span>
新建用户
</a>
</div>
{# 面板 #}
<div class="panel panel-default">
<!-- Default panel contents -->
<div class="panel-heading">
<span class="glyphicon glyphicon-th-large"></span>
用户列表
</div>
<!-- Table -->
<table class="table table-bordered">
<thead>
<tr>
<th>用户ID</th>
<th>姓名</th>
<th>密码</th>
<th>性别</th>
<th>年龄</th>
<th>帐户</th>
<th>注册时间</th>
<th>所属部门</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for user in user_info %}
<tr>
<th scope="row">{{ user.id }}</th>
<td>{{ user.name }}</td>
<td>{{ user.password }}</td>
{# 获取选择元组的元组中对应Key的中文内容,注意:在模板语法中不允许方法后加括号,模板会自动的给方法加上括号 #}
<td>{{ user.get_gender_display }}</td>
<td>{{ user.age }}</td>
<td>{{ user.account }}</td>
{# 获取时间,并转为自定格式;模板语法中提供一套专用的方法用来转换时间;Y(年)、m(月)、d(日)、H(时)、i(分)、s(秒) #}
<td>{{ user.create_time|date:"Y-m-d" }}</td>
{# 获取关联表其它字段,通过获取外键ID对应的对象来获取 #}
<td>{{ user.depart.title }}</td>
<td>
<a href="/depart/{{ obj.id }}/edit/" class="btn btn-primary btn-xs">编辑</a>
<a href="/depart/delete/?did={{ obj.id }}" class="btn btn-danger btn-xs">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
{% endblock %}
3.3 创建列出所有用户函数
在views.py文件中获取用户相关信息,然后将获取的用户数据集返回给user_list.html页面。
# 列出所有用户
def user_list(request):
# 获取数据库中用户数据
user = models.UserInfo.objects.all()
for obj in user:
print(obj.id, obj.name, obj.password, obj.age, obj.account)
# 时间
from datetime import datetime
text = obj.create_time
# %Y(年)、%m(月)、%d(日)、%H(时)、%M(分)、%S(秒)
t = datetime.strftime(text, "%Y-%m-%d %H:%M:%S")
print(t)
# 性别
# Django中提供“get_字段_display()”函数,用于获取选择元组的元组中对应Key的中文内容。
gender = obj.get_gender_display()
print(gender)
# 部门名
# 获取关联表中的其它数据
# Django生成表是会为外键字段自动加id(如:depart字段,生成表时字段为depart_id)
# 其实depart_id只能获取当前表中的字段内容,而depart表示根据id自动的去关联表中获取的那一行的数据对象。
# 所以,想要获取关联表的其它字段时,使depart对象去调用关联表中的其它字段即可(如:depart.title)。
title = obj.depart.title
print(title)
# 将获取到的数据返回给user_list.html页面
return render(request, "user_list.html", {"user_info": user})