在上一小节中我们实现了部门列表的代码逻辑,本篇博文我们开始对员工列表进行一个讲解,如果有看不明白的地方,可以后台私信我,我们一起交流学习。
上一篇博客:Python实现员工管理系统(Django页面版 ) 一-CSDN博客
员工列表的创建步骤:
1. 在models.py里面完成员工列表的数据库建立以及迁移操作
2. 根据需要实现的需求在urls.py配置好每个需求的url地址。
3 根据需求完成实现每个需求对应的函数板块
4. 完成页面展示
这是我们今天需要实现的各个板块内容的效果展示:
下面我们开始实现员工列表的代码逻辑:
员工列表的实现:
1. 数据表的建立以及数据迁移
首先我们先确定员工的各个信息字段
1. 员工ID:Django会默认为我们生成每一条数据的id值作为这条数据的主键,因此我们不需要创建。
2. 姓名:数据类型为char型,字长至少为1
3 年龄:数据类型为int型
4 收入:数据类型为Decimal型(十进制数据类型),位数最多为10位,小数点后默认为2位,默认值为0
5. 电话:数据类型为char型,字长最多为32位
6 入职时间:数据类型为Date型
7 性别:数据类型为SmallInt(短整型),其中1表示‘男’,2表示‘女’,在这里我们做一个映射关系,默认值为1
8 所属部门:这里我们需要给一个表约束,这个字段与部门表做一个外键关联,字段内容与部门id内容一致,当部门被删除时,其所属部门职员也全部被删除。
其中电话数据类型不选择int型的原因:由于后续我们会对电话进行一些约束条件限制,为了方便使用,因此我们采取char作为其数据类型,后面操作也会给出说明。
其中所属部门不用映射的原因:如果所属部门也采取和性别一样的方式写的话,那么每增加一个部门,我们就得写一个映射关系,当部门信息发生变化时,我们也要修改映射关系,这并不方便我们代码的维护,也会使代码看上去冗余。
models.py:
# 员工表
class UserInfo(models.Model):
name = models.CharField(verbose_name="姓名", max_length=64)
age = models.IntegerField(verbose_name="年龄")
salary = models.DecimalField(verbose_name="收入", max_digits=10, decimal_places=2, default=0)
# tel = models.IntegerField(verbose_name="电话")
tel = models.CharField(verbose_name="电话", max_length=32)
create_time = models.DateField(verbose_name="入职时间")
# 表约束
# on_delete=models.CASCADE表示 当部门被删除时,其所属部门职员也全部被删除
depart = models.ForeignKey(to="Department", to_field="id", on_delete=models.CASCADE,default='')
# 在Django当中的约束
gender_choice = (
(1, "男"),
(2, "女")
)
gender = models.SmallIntegerField(verbose_name="性别", choices=gender_choice,default=1)
数据迁移:
当你的数据表创建成功就说明你的数据迁移已经完成
2. 需求实现
2.1 员工列表展示:
员工列表的展示其实可以参考部门列表展示,因为它们实现的逻辑是一致的。
部门列表的映射方法:
部门列表的字段标签
我们仅需要将部门所用的数据表换成员工信息所用的数据表即可,然后在按照员工表的字段修改这些字段标签即可,最后换一下超链接即可,其他的都是一样的。
员工列表的映射方法:
view.py:
员工列表的页面代码展示:
user_list.html:
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<div style="margin-bottom: 10px">
{# target="_blank" 重新打开一个页面 #}
<a href="/user/model/form/add/" class="btn btn-success">
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> 新建用户</a>
</div>
<div class="panel panel-success">
<div class="panel-heading">
<h3 class="panel-title"><span class="glyphicon glyphicon-th-list" aria-hidden="true"></span> 部门列表</h3>
</div>
<div class="panel-body">
<table class="table">
<thead>
<tr>
<th>员工ID</th>
<th>姓名</th>
<th>年龄</th>
<th>薪资</th>
<th>电话</th>
<th>入职时间</th>
<th>性别</th>
<th>部门</th>
</tr>
</thead>
<tbody>
{% for data in data_list %}
<tr>
<td>{{ data.id }}</td>
<td>{{ data.name }}</td>
<td>{{ data.age }}</td>
<td>{{ data.salary }}</td>
<td>{{ data.tel }}</td>
<td>{{ data.create_time|date:"Y-m-d" }}</td>
<td>{{ data.get_gender_display }}</td>
<td>{{ data.depart.title }}</td>
<td>
{# <a href="/user/delete/?nid={{ data.id }}"><span class="glyphicon glyphicon-trash"#}
{# aria-hidden="true"#}
{# style="color: red"></span></a>#}
<a href="/user/{{ data.id }}/delete/"><span class="glyphicon glyphicon-trash"
aria-hidden="true"
style="color: red"></span></a>
<span> </span>
<a href="/user/{{ data.id }}/modify"><span class="glyphicon glyphicon-new-window"
aria-hidden="true"
style="color: #2aabd2"></span></a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
{% endblock %}
最后为了方便展示,我们在里面添加一些数据:
在每次点击员工列表时,数据库都会给我们添加这四组数据。
注意: depart_id 字段由于关联部门表中的id,因此需要和部门表的id内容一致。你们自己做的可能会与我的不同,注意修改。
配置url路径:
urls.py
以上员工列表的展示模块就完成了。
2.2 员工信息添加:
这里和部门列表那边一样,都是在部门信息上面放置一个添加按钮,用户在点击之后则可跳转到信息添加页面当中去,因此这里的添加操作也是可以直接copy一份部门列表的代码,然后把该做修改的地方修改一下即可。
部门添加信息的映射方法:
view,py
部门添加页面代码的展示
depart_add.html
{% extends 'layout.html' %}
{% block content %}
<div class="container">
<div class="panel panel-info">
<div class="panel-heading">
<h3 class="panel-title">增加部门</h3>
</div>
<div class="panel-body">
<form method="post">
{% csrf_token %}
<div class="form-group">
<label for="inputEmail3" class="col-sm-2 control-label">部门名称</label>
<input type="text" class="form-control" id="inputEmail3" placeholder="添加部门" name="title">
</div>
<button type="submit" class="btn btn-success">提交</button>
</form>
</div>
</div>
</div>
{% endblock %}
员工信息添加的页面展示:
员工信息添加的映射方法:
def user_add(request):
if request.method == 'GET':
content = {
# 获取员工信息的性别选择字段
# """
# gender_choice = (
# (1, "男"),
# (2, "女")
# """
'gender_choices': models.UserInfo.gender_choice,
'depart_list': models.Department.objects.all()
}
return render(request, 'user_add.html', content)
user = request.POST.get('name')
age = request.POST.get('age')
salary = request.POST.get('salary')
tel = request.POST.get('tel')
create_time = request.POST.get('create_time')
gender = request.POST.get('gender')
depart = request.POST.get('depart')
models.UserInfo.objects.create(name=user, age=age, salary=salary, tel=tel, create_time=create_time, gender=gender,depart_id=depart)
return redirect('/user/list')
由于我们要展示出一个下拉框让用户进行点击选择,因此我们需要获取字段以及字段内容。
性别:当值为1时,则展示为男,当值为2时,则展示为女,其中默认值为1
所属部门:当值与部门表的id一致时,则展示为id所对应的部门名
员工添加信息的页面代码展示:
user_add.html
{% extends "layout.html" %}
{% block content %}
<div class="container">
<div class="panel panel-info">
<div class="panel-heading">
<h3 class="panel-title">增加部门</h3>
</div>
<div class="panel-body">
<form method="post">
{% csrf_token %}
<div class="form-group">
<label for="inputEmail3" class="col-sm-2 control-label">姓名</label>
<input type="text" class="form-control" id="inputEmail3" placeholder="姓名" name="name">
</div>
<div class="form-group">
<label for="inputEmail3" class="col-sm-2 control-label">年龄</label>
<input type="text" class="form-control" id="inputEmail3" placeholder="年龄" name="age">
</div>
<div class="form-group">
<label for="inputEmail3" class="col-sm-2 control-label">薪资</label>
<input type="text" class="form-control" id="inputEmail3" placeholder="薪资" name="salary">
</div>
<div class="form-group">
<label for="inputEmail3" class="col-sm-2 control-label">电话号码</label>
<input type="text" class="form-control" id="inputEmail3" placeholder="电话号码" name="tel">
</div>
<div class="form-group">
<label for="inputEmail3" class="col-sm-2 control-label">入职时间</label>
<input type="text" class="form-control" id="inputEmail3" placeholder="入职时间" name="ctime">
</div>
<div class="form-group">
<label for="inputEmail3" class="col-sm-2 control-label">性别</label>
<select class="form-control" name="sex">
{% for item in gender_choices %}
<option value="{{ item.0 }}">{{ item.1 }}</option>
{% endfor %}
</select>
</div>
<div class="form-group">
<label for="inputEmail3" class="col-sm-2 control-label">部门名称</label>
<select class="form-control" name="depart">
{% for item in depart_list %}
<option value="{{ item.id }}">{{ item.title }}</option>
{% endfor %}
</select>
</div>
<button type="submit" class="btn btn-success">提交</button>
</form>
</div>
</div>
</div>
{% endblock %}
url的配置:
urls.py:
# 员工增加
path('user/add/', views.user_add),
2.3 员工信息删除和修改:
员工信息的删除和修改和部门列表一样,都是通过其数据的主键id进行删除和修改,通过构建url,对指定数据进行删除。删除和修改操作在上一篇博客中有详细讲过,如果有哪一块没看明白,可以去看一下上一篇博客或者私信留言。
删除:
view.py:
# 删除员工信息一
# def user_delete(request):
# nid = request.GET.get("nid")
# models.UserInfo.objects.filter(id=nid).delete()
# return redirect("/user/list")
# 删除员工信息二
def user_delete(request, nid):
models.UserInfo.objects.filter(id=nid).delete()
return redirect('/user/list/')
urls.py:
# 员工删除
# path('user/delete/', views.user_delete), # 方式一
path('user/<int:nid>/delete/', user.user_delete), #方式二
由于删除操作并没有必要在复写一个界面进行展示,因此我们直接返回主界面即可。
修改:
修改操作和删除会有一点区别,删除操作仅仅只是一个get请求方法,因为它并不涉及到数据库的操作,因此调用方法就可完成。而修改操作在用户进行修改操作的时候是get请求方法,再另外一个页面做提交数据修改时则为post请求方法。
views.py
def user_update(request):
nid = request.GET.get('nid')
if request.method == 'GET':
return render(request,'user_update.html')
name = request.POST.get('name')
age = request.POST.get('age')
salary = request.POST.get('salary')
tel = request.POST.get('tel')
create_tim = request.POST.get('create_tim')
gender = request.POST.get('gender')
age_if = int(age)
if age_if < 0 or age_if > 120:
error_message = '年龄不符合规范'
return render(request,'user_update.html',{'error_message':error_message})
tel_if = str(tel)
if len(tel_if) != 5:
error_message = '电话只能为5位'
return render(request, 'user_update.html', {'error_message': error_message})
models.UserInfo.objects.filter(id=nid).update(name=name,age=age,salary=salary,tel=tel,create_tim=create_tim,gender=gender)
return redirect('/user/list')
user_update.html
{% load static %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="{% static 'bootstrap-3.4.1-dist/css/bootstrap.min.css' %}">
</head>
<body>
<div class="navbar navbar-default">
<div class="container">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle collapsed" data-toggle="collapse"
data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a class="navbar-brand" href="#">管理系统</a>
</div>
<!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<ul class="nav navbar-nav">
<li><a href="http://127.0.0.1:8000/depart/list/">部门列表</a></li>
<li><a href="http://127.0.0.1:8000/user/list/">员工列表</a></li>
</ul>
<ul class="nav navbar-nav navbar-right">
<li><a href="#">登录</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true"
aria-expanded="false">朱宇飞 <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a href="#">Action</a></li>
<li><a href="#">Another action</a></li>
<li><a href="#">Something else here</a></li>
<li role="separator" class="divider"></li>
<li><a href="#">Separated link</a></li>
</ul>
</li>
</ul>
</div><!-- /.navbar-collapse -->
</div><!-- /.container-fluid -->
</div>
{#错误展示#}
<div class="container" style="color: red">
{% if error_message %}
<div class="alert alert-danger" role="alert">
{{ error_message }}
</div>
{% endif %}
</div>
<div class="container">
<div class="panel panel-info">
<div class="panel-heading">
<h3 class="panel-title">修改员工信息</h3>
</div>
<div class="panel-body">
<form method="post">
{% csrf_token %}
<div class="form-group">
<label for="inputEmail3" class="col-sm-2 control-label">用户信息更改</label>
<input type="text" class="form-control" placeholder="员工姓名" name="name" style="margin-bottom: 10px">
<input type="text" class="form-control" placeholder="员工年龄" name="age" style="margin-bottom: 10px">
<input type="text" class="form-control" placeholder="员工薪资" name="salary"
style="margin-bottom: 10px">
<input type="text" class="form-control" placeholder="员工电话" name="tel" style="margin-bottom: 10px">
<input type="text" class="form-control" placeholder="员工入职时间" name="create_tim"
style="margin-bottom: 10px">
<input type="text" class="form-control" placeholder="员工性别" name="gender"
style="margin-bottom: 10px">
</div>
<button type="submit" class="btn btn-success" onclick="before_submit()">提交</button>
<a href="/user/list/" class="btn btn-success">
<span class="glyphicon glyphicon-log-out" aria-hidden="true"> 退出修改</span>
</a>
</form>
</div>
</div>
</div>
<script type="text/javascript">
function before_submit() {
alert('提交成功')
}
</script>
<script src="{% static 'js/jquery-3.7.1.js' %}"></script>
<script src="{% static 'bootstrap-3.4.1-dist/js/bootstrap.min.js' %}"></script>
</body>
</html>
urls.py
path('user/update/', views.user_update)
以上就是员工列表的整个操作流程。
由于代码内容过多,不太好全部展示,等后续我会在GitHub上将所有代码都放入的哈。本文中如果存在问题或者读友有模糊的地方可以评论留言或者私信。