Python实现员工管理系统(Django页面版 ) 二

         在上一小节中我们实现了部门列表的代码逻辑,本篇博文我们开始对员工列表进行一个讲解,如果有看不明白的地方,可以后台私信我,我们一起交流学习。

上一篇博客: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>&nbsp;&nbsp;</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">&nbsp;退出修改</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上将所有代码都放入的哈。本文中如果存在问题或者读友有模糊的地方可以评论留言或者私信。

 

  • 22
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值