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

本节实现效果:

        在上一小节中我们实现了账号管理这个功能,今天我们实现上一小节中遗留的几个点,分别是条件筛选与搜索和翻页处理。

条件筛选与搜索:

        条件筛选的实质就是通过给予条件给数据库让数据库传递给我们需要的数据,展示客户需要查看的数据。

例如我们选择要查询手机号为15355556666,id值为7的数据,那我们就可以这么写入我们的条件

models.PrettyNum.objects.filter(mobile="15355556666",id=7)

这样数据库就能给我们返回符合条件的全部数据。

Django为我们提供了一些条件筛选的方法:

  • 对于整数

        models.PrettyNum.objects.filter(price=100)               价格等于100
        models.PrettyNum.objects.filter(price__gt=100)        价格大于100
        models.PrettyNum.objects.filter(price__gte=100)      价格大于等于100
        models.PrettyNum.objects.filter(price__lt=100)         价格小于100
        models.PrettyNum.objects.filter(price__lte=100)       价格小于等于100

  • 对于字符串

        models.PrettyNum.objects.filter(mobile__contains="153")        包含135
        models.PrettyNum.objects.filter(mobile__startswidth="153")    以135开头
        models.PrettyNum.objects.filter(mobile__endswidth="153")      以135结尾
 

下面我介绍两种方式的查询手段:

手机号查询(表单提交获取表单内容)

我们选择需要实现这个需求:当我们输入手机号的部分数据的时候,数据库就会将包含这些数据的手机号给我们显示出来

 

 我们在我们的输入框中输入135时,数据库就会只为我们展示包含135的数据。

 那我们就根据这个思路开始实现我们的代码:

        首先我们是想通过表单将我们的数据进行一个提交,我们可以将我们传入的数据以参数的形式返回到我们的后端,然后让后端将获取到的请求获取其中的参数信息,最后通过参数信息进行数据筛选,最后返回筛选后的数据。

我们在我们的pertty.html页面中创建一个表单,将其属性name的值query作为参数,然后让后端获取到这个query。

        <div style="float: right; width: 300px">
            <form method="get">
                <div class="input-group">
                    <input type="text" class="form-control" placeholder="Search for..." name="query">
                    <span class="input-group-btn">
                    <button class="btn btn-default" type="submit"><span class="glyphicon glyphicon-search"
                                                                        aria-hidden="true"></span></button>
                  </span>
                </div>
            </form>
        </div>

下面我们开始重新写我们的账号列表展示的这个组件的方法。

pretty.py

def pretty_list(request):
    # 筛选条件字典
    dict_data = {}
    # 搜索
    value = request.GET.get('query')
    if value:
        dict_data['mobile__contains'] = value
    # order_by 将level从低到高排序
    queryset = models.PrettyNum.objects.filter(**dict_data).order_by('level')
    return render(request,'pretty_list.html',{'data_pretty_list':queryset})

这样我们的搜索条件即可完成。

等级筛选(a标签直接请求并传递参数)

        我们在对手机号查询是通过输入进行搜索查询,现在我想要通过按钮直接点击即可将我想要的内容进行展示。

         其实大家可以直接写这个内容,无非就是一个下拉框下面有我们需要查询的条件,但是如果说我们直接写的话如果出现很多条件,例如等级如果说有20条,那我们也不能写20个a标签。

其实这个问题也很好解决,我们在models.py对level这个字段进行编写的时候是使用了一个choiice进行一个映射选择。

 我们可以直接通过类获取到这个数据然后将其传入到前端进行一个遍历即可。

pretty.html

        {# 等级筛选 #}
        <div style="float: right">
            <div class="input-group">
                <div class="btn-group">
                    <button type="button" class="btn btn-warning dropdown-toggle" data-toggle="dropdown"
                            aria-haspopup="true" aria-expanded="false">等级筛选<span class="caret"></span></button>
                    <ul class="dropdown-menu">
                        {% for data in level_list %}
                            <li><a href="?level={{ data.0 }}">{{ data.1 }}</a></li>
                        {% endfor %}
                    </ul>
                </div>
            </div>
        </div>

        其中data就是这个大元组中的其中一个小元组,data.0就是前面的数字,而data.1就是后面的等级,我们在点击这个a标签时,他会发送一个请求给到我们的后端,然后我们的后端仅需获取里面的参数level,将其作为条件进行筛选,最后将筛选后的数据传递给我们的前端。

pretty.py

def pretty_list(request):
    # 筛选条件字典
    dict_data = {}
    # 搜索
    value = request.GET.get('query')
    if value:
        dict_data['mobile__contains'] = value

    value = request.GET.get('level')
    if value:
        dict_data['level__contains'] = value
    # 统计数据表当中有多少条数据
    queryset = models.PrettyNum.objects.filter(**dict_data).order_by('level')
    # 筛选等级
    level_list = models.PrettyNum.level_choice

    return render(request,'pretty_list.html',{'data_pretty_list':queryset ,'level_list':level_list})

以上就是我们的条件筛选板块就完成了。

翻页处理:

        为了便于我们进行观察翻页处理,我们往数据库中多添加一些数据。

需求:

1. 我只希望它一页给我展示10条数据

2. 我只希望它只给我展示以当前页面为基准,同时展示前三页和后三页,随着页面的变化这些页面选择也会发送变化

3. 我需要有一个首页和尾页标签,通过点击即可跳转到首页和尾页

4. 我需要有一个上一页和下一个标签,通过点击即可跳转到上一页和下一页

5. 最后我需要实现一个条件搜索,通过指定页面即可跳转到该条件下的页面

需求1:一页展示10条数据

        我们通过数据表进行查询的数据实质上是一个列表,列表里面是我们的一条数据,然后这些数据是由一个一个键值对组成,对于列表我们要进行一个数据划分最好的方式就是切片。可以想一想我们切片的起点是不是应该为 (当前页面 - 1) * 展示条数,而我们的切片终点为 当前页面 * 展示条数,这个可以带值进行计算这里就不在赘述。

 # 翻页
    page = int(request.GET.get("page", 1))
    # 当前一页展示10条信息
    page_size = 10
    # 开始切片
    start = (page - 1) * page_size
    # 结束切片
    end = page * page_size

需求2:以当前页面为基准,同时展示前三页和后三页

        例如我以7为基准,然后 它会给我展示4,5,6页,8,9,10页。然后我们将4-10页分别展示即可。因此我们可以通过这样的方式进行计算,当前页面-3为起点,当前页面+3为终点,然后遍历即可。有细心的小伙伴会发现这个方法其实并不完美,如果说当前页面为1,那么我们在-3后它的起点是-2,这样并不符合逻辑。如果说当前页面为最后一个,那么我们在+3后它的终点会超过我们最后一页的范围,这样也不符合逻辑,还有一种情况就是如果数据并没有7条数据,那么这么计算也会出现问题,因此我们需要对这样特殊的位置进行一个处理。

对于最前面三页:我们可以直接将起点设置为1,终点则为 2 * 3 + 1。

对于最后面三页:我们可以将起点设置为总页数 - 2 * 3,终点为总页数。

如果数据并没有7条数据,那么我们直接将起点设置为1,终点为总页数即可。

# 统计数据表当中有多少条数据
    total_count = models.PrettyNum.objects.filter(**dict_data).order_by("level").count()
    data_pretty_list = models.PrettyNum.objects.filter(**dict_data).order_by("level")[start: end]

    # 根据数据表当中的数据条数以及分页的数据条数计算分多少页
    total_page_count, div = divmod(total_count, page_size)
    if div:
        total_page_count += 1

    # 计算出当前页展示的前三页和后三页
    plus = 3
    # 如果当前数据表数据小于7
    if total_page_count <= 2 * plus + 1:
        start_page = 1
        end_page = total_page_count
    else:
        # 当前选中的页小于3的时候(最小)
        if page <= plus:
            start_page = 1
            end_page = 2 * plus + 1
        else:
            # 当前页+3大于总页数  总页数21   22 23 24
            if (page + plus) > total_page_count:
                start_page = total_page_count - 2 * plus
                end_page = total_page_count
            else:
                # 开始的页面
                start_page = page - plus
                end_page = page + plus

    # 页码列表
    page_str_list = []
    for page_num in range(start_page, end_page+1):
        if page_num == page:
            page_ele = f'<li class="active"><a href="?page={page_num}">{page_num}</a></li>'
        else:
            page_ele = f'<li><a href="?page={page_num}">{page_num}</a></li>'
        page_str_list.append(page_ele)

需求3:首页和尾页

        对于首页和尾页的处理非常简单,我相信大家一看就能明白,就不多赘述了。

    # 首页
    page_str_list.append(f'<li class="active"><a href="?page={1}">首页</a></li>')
    # 尾页
    page_str_list.append(f'<li class="active"><a href="?page={total_page_count}">尾页</a></li>')

需求4:上一页和下一页

        上一页无非就是在这一页的基础上做一个-1的操作,但是我们有一个点需要注意一下,就是我们在对于第一页进行操作的时候它的上一页是没有的,因此我们需要对当前页面为1的时候做一个禁止它点击操作。

        下一页无非就是在这一页的基础上做一个+1的操作,但是我们有一个点需要注意一下,就是我们在对于最后一页进行操作的时候它的下一页是没有的,因此我们需要对当前页面为最后一页的时候做一个禁止它点击操作。

    # 上一页(当前页-1)
    if page > 1:
        page_str_list.append(f'<li class="active"><a href="?page={page - 1}">上一页</a></li>')
    else:
        page_str_list.append(f'<li class="active"><a href="?page={1}" style="pointer-events:none;">上一页</a></li>')

    # 下一页(当前页+1)
    if page < total_page_count:
        page_str_list.append(f'<li class="active"><a href="?page={page + 1}">下一页</a></li>')
    else:
        page_str_list.append(f'<li class="active"><a href="?page={1}" style="pointer-events:none;">下一页</a></li>')

需求5:页面跳转

        页面跳转的思想在刚刚的条件筛选那边已经说过了,这边就直接给出代码,大家可以对比看一下。

        serch_string = """
            <li>
                <form method="get" style="float: left; margin-left: 1px">
                    <input type="text" class="form-control" placeholder="页码" name="page"
                           style="position: relative;float: left;display: inline-block;width: 70px">
                    <button type="submit" class="btn btn-info dropdown-toggle">跳转</button>
                </form>
            </li>
        
        """
        page_str_list.append(serch_string)

最后我们将这个页面列表传递到前端页面中即可

        # 用于将字符串数据转化为源代码格式
        from django.utils.safestring import mark_safe
        page_string = mark_safe(''.join(page_str_list))

        return page_string

pretty.py:

# -------------------------账号管理----------------------------------------------
def pretty_list(request):
    # 搜索
    dict_data = {}
    value = request.GET.get("query")
    if value:
        dict_data["mobile__contains"] = value

    value = request.GET.get('level')
    if value:
        dict_data['level'] = value
    # 翻页
    page = int(request.GET.get("page", 1))
    # 当前一页展示10条信息
    page_size = 10
    # 开始切片
    start = (page - 1) * page_size
    # 结束切片
    end = page * page_size

    level_list = models.PrettyNum.level_choice
    # 统计数据表当中有多少条数据
    total_count = models.PrettyNum.objects.filter(**dict_data).order_by("level").count()
    data_pretty_list = models.PrettyNum.objects.filter(**dict_data).order_by("level")[start: end]

    # 根据数据表当中的数据条数以及分页的数据条数计算分多少页
    total_page_count, div = divmod(total_count, page_size)
    if div:
        total_page_count += 1

    # 计算出当前页展示的前三页和后三页
    plus = 3
    # 如果当前数据表数据小于7
    if total_page_count <= 2 * plus + 1:
        start_page = 1
        end_page = total_page_count
    else:
        # 当前选中的页小于3的时候(最小)
        if page <= plus:
            start_page = 1
            end_page = 2 * plus + 1
        else:
            # 当前页+3大于总页数  总页数21   22 23 24
            if (page + plus) > total_page_count:
                start_page = total_page_count - 2 * plus
                end_page = total_page_count
            else:
                # 开始的页面
                start_page = page - plus
                end_page = page + plus

    # 页码列表
    page_str_list = []
    # 首页
    page_str_list.append(f'<li class="active"><a href="?page={1}">首页</a></li>')
    # 上一页(当前页-1)
    if page > 1:
        page_str_list.append(f'<li><a href="?page={page - 1}">上一页</a></li>')
    else:
        page_str_list.append(f'<li><a href="?page={1}" style="pointer-events:none;">上一页</a></li>')

    for page_num in range(start_page, end_page + 1):
        if page_num == page:
            page_ele = f'<li class="active"><a href="?page={page_num}">{page_num}</a></li>'
        else:
            page_ele = f'<li><a href="?page={page_num}">{page_num}</a></li>'
        page_str_list.append(page_ele)

    # 下一页(当前页+1)
    if page < total_page_count:
        page_str_list.append(f'<li><a href="?page={page + 1}">下一页</a></li>')
    else:
        page_str_list.append(f'<li><a href="?page={1}" style="pointer-events:none;">下一页</a></li>')
    # 尾页
    page_str_list.append(f'<li><a href="?page={total_page_count}">尾页</a></li>')

    # 将字符串传递到源代码
    page_string = mark_safe("".join(page_str_list))
    return render(request, "pretty_list.html", {"data_pretty_list": data_pretty_list, "page_string": page_string,'level_list':level_list})

pretty_list.html:

{% extends 'layout.html' %}
{% block content %}
    <div class="container">
        <div style="margin-bottom: 10px">
            {# target="_blank" 重新打开一个页面 #}
            <a href="/pretty/add/" class="btn btn-success">
                <span class="glyphicon glyphicon-plus" aria-hidden="true"></span> 新建账号</a>
        </div>
        {#搜索按钮#}
        <div style="float: right; width: 300px">
            <form method="get">
                <div class="input-group">
                    <input type="text" class="form-control" placeholder="Search for..." name="query">
                    <span class="input-group-btn">
                    <button class="btn btn-default" type="submit"><span class="glyphicon glyphicon-search"
                                                                        aria-hidden="true"></span></button>
                  </span>
                </div>
            </form>
        </div>
        {# 等级筛选 #}
        <div style="float: right">
            <div class="input-group">
                <div class="btn-group">
                    <button type="button" class="btn btn-warning dropdown-toggle" data-toggle="dropdown"
                            aria-haspopup="true" aria-expanded="false">等级筛选<span class="caret"></span></button>
                    <ul class="dropdown-menu">
                        {% for data in level_list %}
                            <li><a href="?level={{ data.0 }}">{{ data.1 }}</a></li>
                        {% endfor %}
                    </ul>
                </div>
            </div>
        </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>
                    </tr>
                    </thead>
                    <tbody>
                    {% for data in data_pretty_list %}
                        <tr>
                            <td>{{ data.id }}</td>
                            <td>{{ data.mobile }}</td>
                            <td>{{ data.price }}</td>
                            <td>{{ data.get_level_display }}</td>
                            <td>{{ data.get_status_display }}</td>
                            <td>
                                {#                                <a href="/user/delete/?nid={{ data.id }}"><span class="glyphicon glyphicon-trash"#}
                                {#                                                                                aria-hidden="true"#}
                                {#                                                                                style="color: red"></span></a>#}
                                <a href="/pretty/{{ data.id }}/delete/"><span class="glyphicon glyphicon-trash"
                                                                              aria-hidden="true"
                                                                              style="color: red"></span></a>
                                <span>&nbsp;&nbsp;</span>
                                <a href="/pretty/{{ data.id }}/modify"><span class="glyphicon glyphicon-new-window"
                                                                             aria-hidden="true"
                                                                             style="color: #2aabd2"></span></a>
                            </td>
                        </tr>
                    {% endfor %}

                    </tbody>
                </table>
            </div>
        </div>
        <ul class="pagination">
            {{ page_string }}
        </ul>
    </div>
{% endblock %}

        以上就是本次条件筛选和搜索的全部内容,如若有不明白或者有错误的地方,可以后台私信,谢谢大家。

  • 20
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
【资源说明】 课程设计基于Django+Python开发的图书销售管理系统源码+项目说明.zip Sales_system:主应用程序目录,这里用来调控整个项目 **__pycache__**:缓存文件夹,不用在意 **__init__**.py:初始化文件,不用在意 asgi.py:控制网关接口,与实验无关 settings.py:这是整个项目的设置文件,比较重要 urls.py:url接口文件,这里控制所有url访问 wsgi.py:控制网关接口,与实验无关 ss_env:这个文件夹用于创建虚拟环境,方便部署到服务器上,与实验无关 static:静态文件文件夹,用于存储所有静态文件 css:css文件目录 images:图片目录 migrations:迁移数据文件夹,用于将建好的模型迁移至数据库,使数据库创建相应table templates/system:页面目录,所有系统相关html文件都在这里 about.html:网站介绍页面 base.html:导航栏 books_display.html:书库页面 bookshop.html:书城页面 finance.html:财务页面 home.html:主页 info_detail:书籍详情页面 new_book_for_stock.html:进货时新建图书页面 new_book.html:新建图书页面 stock.html:进货页面 stockbills.html:货单页面 **__init__**.py:初始化文件,不用在意 admin.py:管理网站注册页面,在这里注册管理网站的模型,与实验无关 apps.py:应用程序文件,本项目没有用到 forms.py:表单文件,这里创建了需要使用到的表单模型 models.py:模型文件,这里定义了数据库模型,在迁移后数据库会根据模型建表 tests.py:测试文件,本项目没有用到 └── views.py:视图文件,这里编写了所有页面对应的后端视图,后端代码的处理都在这个地方 Userinfo:用户应用程序目录,这里实现了所有用户相关页面及其功能 **__pycache__**:缓存文件夹,不用在意 migrations:迁移数据文件夹,用于将建好的模型迁移至数据库,使数据库创建相应table templates:页面目录,所有用户相关html文件都在这里 registration logged_out.html:登出页面 【备注】 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用!有问题请及时沟通交流。 2、适用人群:计算机相关专业(如计科、信息安全、数据科学与大数据技术、人工智能、通信、物联网、自动化、电子信息等)在校学生、专业老师或者企业员工下载使用。 3、用途:项目具有较高的学习借鉴价值,也适用于小白学习入门进阶。当然也可作为毕设项目、课程设计、大作业、初期项目立项演示等。 4、如果基础还行,或者热爱钻研,亦可在此项目代码基础上进行修改添加,实现其他不同功能。 欢迎下载,沟通交流,互相学习,共同进步!
基于python的企业物流管理系统 pythondjango;mysql; 本文介绍和设计了一个基于Python语言的企业物流管理系统。本系统通过使用Python编程语言和开源的Python库,实现了物流运输的计划、管理、监控、跟踪等功能。该系统可以帮助企业实现对物流运输的全程管理,包括订单管理、物流运输规划、运输路线优化、物流运输监控、异常情况处理等功能。 主要功能 登录页面: (1)需要给与使用用户账号密码,用户方可登录进入系统进行操作,实际工作情境中会由上级下发账户密码给下级使用。 登录后页面: (2)汇总了基本的每日数据情况包括用户数,收入支出等基本内容,便于使用系统的用户进行查看。 (3)展示了当前计算机的系统信息,包括使用的python本,mysql本等。 (4)注销账号功能,便于后续人员继续使用该系统,不同的职级拥有不同的账号权限。 订单管理模块: (5)临时订单:临时订单中用户可以查看订单,但并无操作权限,需要更高级别权限便可操作审核 (6)正式订单:正式订单包括货物id,状态,产品名等,用户可以进行具体的订单修改 货物管理模块:用户可以对公司货物进行系统录入,包括产品名称,id,状态 仓储管理模块:用户对以及录入系统的货物进行出入库操作管理 运输管理模块: (1)运输员管理:对今日正常工作的运输员进行管理,包括其姓名,车牌,运输数量和是否在岗,可根据货物名称查询。 (1)运输订单:可根据运输员姓名对订单进行查找,管理订单情况,包括收发车时间等。 人事管理模块: (1)用户管理:对员工进行管理,包括id,姓名车牌号,状态等信息可根据具体姓名进行查找信息。 (2)个人信息:可对用户资料进行修改,以及修改登陆密码等功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值