【Django】网上蛋糕商城后台-订单管理

概念

前面通过多篇文章以完全实现了用户在网上蛋糕商城平台上的所有功能和操作,从本文开始,实现网站的后台管理功能的介绍和操作。

导入静态资源

在static文件夹下,创建admin文件夹,在该文件夹下导入静态资源

在templates文件夹下创建adminTemp文件夹,建议不要把文件名定义为admin,会和django自带模板文件有冲突。将后台管理的html代码创建在该文件夹下

订单列表

想要进入后台管理系统,则登入的用户一定是管理员账号,这个账号和密码只有管理员才知道,因此不用担心顾客会登录后台管理系统。我们在数据库中已存储一个管理员账号和密码,可以进行使用。当通过管理员账号和密码登录成功后,head.html头部页面中会出现后台管理选项。

在urls文件夹中定义接收该请求的地址

python 复制代码
path('a_index/', viewsAdmin.admin_index),

在views文件的同级目录下创建viewsAdmin文件作为后台管理的业务逻辑处理文件,并创建处理进入后台管理的主页函数

python 复制代码
def admin_index(request):
    return render(request,"adminTemp/index.html")

其头部代码如下

html 复制代码
<nav class="navbar navbar-default" role="navigation">
    <div class="container-fluid">
        <div class="navbar-header">
            <a class="navbar-brand" href="/a_index/">蛋糕店后台</a>
        </div>
        <div>
            <ul class="nav navbar-nav">
                <li ><a href="/admin/order_list/">订单管理</a></li>
                <li ><a href="/admin/user_list/">客户管理</a></li>
                <li ><a href="/admin/goods_list/">商品管理</a></li>
                <li ><a href="/admin/type_list/">类目管理</a></li>
                <li><a href="/user_logout/">退出</a></li>
            </ul>
        </div>
    </div>
</nav>

后台管理首页代码如下

html 复制代码
<!DOCTYPE html>
<html>
<head>
<title>后台管理</title>
    {% load static %}
<link rel="stylesheet" href="{% static 'admin/css/bootstrap.css' %}"/>
</head>
<body>
<div class="container-fluid">
    {% include "adminTemp/header.html" %}
	<br><br>
	<div class="alert alert-success" role="alert">恭喜你! 登录成功了</div>
</div>	
</body>
</html>

点击订单管理,触发超链接请求,在urls文件中定义该请求地址

python 复制代码
path('admin/order_list/',viewsAdmin.order_list),

在viewsAdmin文件中定义处理该请求的函数

python 复制代码
# 处理订单管理的列表页面请求
def order_list(request):
    try:
        status=request.GET["status"]
    except:
        status=0 # 全部
    # 读取分页页码
    try:
        ym = request.GET["ym"]
    except:
        ym = 1

    if int(status) == 0:
        # 查询订单列表
        orders = Order.objects.all().order_by("id").values()
    else:
        # 根据支付状态查询
        orders=Order.objects.filter(status=status).order_by("id").values()

    # 将该分类的商品信息进行分页处理,每页显示5条记录
    pag = paginator.Paginator(orders, 5)
    # 根据当前页码获取当前分页信息
    pageInfo = pag.get_page(ym)
    # 获取当前页的商品列表信息
    orders = pageInfo.object_list
    # 获取总页码数
    yms = pag.page_range
    # 根据订单编号查所有子订单
    for order in orders:
        order["datetime"] = str(order["datetime"])
        # 根据用户id查询用户名称
        username=User.objects.filter(id=order["user_id"])[0].name
        order["username"]=username
        items = OrderItem.objects.filter(order_id=order["id"]).values()
        # 根据每个子订单中的商品编号查询商品名称
        for item in items:
            goods = Goods.objects.filter(id=item["goods_id"]).values()
            item["goods"] = goods[0]
        order["items"] = items

    return render(request, "adminTemp/order_list.html",
                  {"orders": orders, "page": pageInfo, "yms": yms,"status":status})
html 复制代码
<!DOCTYPE html>
<html>
<head>
    <title>订单列表</title>
    {% load static %}
    <link rel="stylesheet" href="{% static 'css/bootstrap.css' %}"/>
    <style>
        #nav{
            width: 100%;
            height: 40px;
            margin-top: 20px;
            clear: left;
        }
        #nav a{
            text-decoration: none;
            margin: 3px;
            background-color: cadetblue;
        }
        #nav a:hover{
            background-color: #FF1719;
        }

        #nav a.c_page{
            background-color: #FF1719;
        }
        #nav a.up_page,#nav a.do_page{
            width: 70px;
            height: 30px;
            padding: 5px 10px;
            border-radius: 5px;
            color: white;
            display: inline-block;
        }
        #nav a.p_page{
            width: 30px;
            height: 30px;
            padding: 5px;
            border-radius: 5px;
            color: white;
            display: inline-block;
        }
    </style>
</head>
<body>
<div class="container-fluid">
    {% include "adminTemp/header.html" %}
    <br>
    <ul role="tablist" class="nav nav-tabs">
        <li{% if status == 0 %} class="active"{% endif %}
                                role="presentation"><a href="/admin/order_list/">全部订单</a></li>
        <li
                {% if status == 1 %}
                    class="active"
                {% endif %}
                    role="presentation"><a href="/admin/order_list/?status=1">未付款</a></li>
        <li
                {% if status == 2 %}
                    class="active"
                {% endif %}
                    role="presentation"><a href="/admin/order_list/?status=2">已付款</a></li>
        <li
                {% if status == 3 %}
                    class="active"
                {% endif %}
                    role="presentation"><a href="/admin/order_list/?status=3">配送中</a></li>
        <li
                {% if status == 4 %}
                    class="active"
                {% endif %}
                    role="presentation"><a href="/admin/order_list/?status=4">已完成</a></li>
    </ul>
    <br>
    <table class="table table-bordered table-hover">
        <tr>
            <th width="5%">ID</th>
            <th width="5%">总价</th>
            <th width="15%">商品详情</th>
            <th width="20%">收货信息</th>
            <th width="10%">订单状态</th>
            <th width="10%">支付方式</th>
            <th width="10%">下单用户</th>
            <th width="10%">下单时间</th>
            <th width="10%">操作</th>
        </tr>
        {% for order in orders %}

            <tr>
                <td><p>{{ order.id }}</p></td>
                <td><p>{{ order.total }}</p></td>
                <td>
                    {% for item in order.items %}
                        <p>{{ item.goods.name }}({{ item.goods.price }}) x {{ item.amount }}</p>
                    {% endfor %}
                </td>
                <td>
                    <p>{{ order.name }}</p>
                    <p>{{ order.phone }}</p>
                    <p>{{ order.address }}</p>
                </td>
                <td>
                    <p>

                        {% if order.status == 2 %}
                            <span style="color:red;">已付款</span>
                        {% endif %}
                        {% if order.status == 3 %}
                            <span style="color:red;">已发货</span>
                        {% endif %}
                        {% if order.status == 4 %}
                            <span style="color:red;">已完成</span>
                        {% endif %}
                    </p>
                </td>
                <td>
                    <p>
                        {% if order.paytype == 1 %}
                            微信
                        {% endif %}
                        {% if order.paytype == 2 %}
                            支付宝
                        {% endif %}{% if order.paytype == 3 %}
                        货到付款
                    {% endif %}
                    </p>
                </td>
                <td><p>{{ order.username }}</p></td>
                <td><p>{{ order.datetime }}</p></td>
                <td>
                    {% if order.status == 2 %}
                        <a class="btn btn-success" href="/admin/order_status/?id={{ order.id  }}&status=3">发货</a>
                    {% endif %}
                    {% if order.status == 3 %}
                        <a class="btn btn-warning" href="/admin/order_status/?id={{ order.id  }}&status=4">完成</a>
                    {% endif %}
                    <a class="btn btn-danger"
                           href="/admin/order_delete/?id={{ order.id  }}">删除</a>


                </td>
            </tr>
        {% endfor %}


    </table>
    <br>
    <!-- 显示页码导航栏 -->
    <div id="nav" align="center">
        <!-- 上一页 -->
        <!-- 判断当前页是否有上一页,如果有上一页则显示上一页的按钮,否则就不显示上一页 -->
        {% if page.has_previous %}
            <a href="/admin/order_list/?ym={{ page.previous_page_number }}&status={{ status }}" class="up_page">上一页</a>
        {% endif %}
        <!-- 页码 -->
        {% for ym in yms %}
            {% if page.number == ym %}
                <a href="/admin/order_list/?ym={{ ym }}&status={{ status }}" class="p_page c_page">{{ ym }}</a>
            {% else %}
                <a href="/admin/order_list/?ym={{ ym }}&status={{ status }}" class="p_page">{{ ym }}</a>
            {% endif %}
        {% endfor %}

        <!-- 下一页 -->
        {% if page.has_next %}
            <a href="/admin/order_list/?ym={{ page.next_page_number }}&status={{ status }}" class="do_page">下一页</a>
        {% endif %}
    </div>
    <br>
</div>
</body>
</html>

处理订单的发货和交易完成

点击订单的发货或者完成,发送请求,在urls文件中接收该请求

python 复制代码
path('admin/order_status/',viewsAdmin.order_status),

在viewsAdmin文件中定义函数处理该请求

python 复制代码
# 处理订单状态请求
def order_status(request):
    # 获取订单编号
    id=request.GET["id"]
    # 获取状态码
    status=request.GET["status"]
    # 根据订单编号查询订单
    order=Order.objects.filter(id=id)
    # 修改该订单的状态
    order.update(status=status)
    # 刷新订单
    return HttpResponseRedirect("/admin/order_list/")

删除订单功能

点击列表管理中的订单进行删除,触发请求,在urls文件中定义接收该请求的地址

python 复制代码
path('admin/order_delete/',viewsAdmin.order_delete),

在viewsAdmin文件中创建处理该请求的函数

python 复制代码
# 处理删除订单请求
def order_delete(request):
    # 获取订单编号
    id=request.GET["id"]
    # 根据订单id先删除子订单表中的相关订单商品信息
    item=OrderItem.objects.filter(order_id=id)
    item.delete()
    # 根据订单id执行删除订单操作
    order=Order.objects.get(id=id)
    order.delete()
    # 刷新订单
    return HttpResponseRedirect("/admin/order_list/")
相关推荐
智慧老师7 分钟前
Spring基础分析13-Spring Security框架
java·后端·spring
Kai HVZ33 分钟前
python爬虫----爬取视频实战
爬虫·python·音视频
古希腊掌管学习的神35 分钟前
[LeetCode-Python版]相向双指针——611. 有效三角形的个数
开发语言·python·leetcode
m0_7482448338 分钟前
StarRocks 排查单副本表
大数据·数据库·python
B站计算机毕业设计超人1 小时前
计算机毕业设计PySpark+Hadoop中国城市交通分析与预测 Python交通预测 Python交通可视化 客流量预测 交通大数据 机器学习 深度学习
大数据·人工智能·爬虫·python·机器学习·课程设计·数据可视化
路人甲ing..1 小时前
jupyter切换内核方法配置问题总结
chrome·python·jupyter
游客5201 小时前
opencv中的常用的100个API
图像处理·人工智能·python·opencv·计算机视觉
每天都要学信号1 小时前
Python(第一天)
开发语言·python
搬码后生仔1 小时前
asp.net core webapi项目中 在生产环境中 进不去swagger
chrome·后端·asp.net
凡人的AI工具箱1 小时前
每天40分玩转Django:Django国际化
数据库·人工智能·后端·python·django·sqlite