【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/")
相关推荐
华清远见IT开放实验室4 分钟前
【每天学点AI】实战图像增强技术在人工智能图像处理中的应用
图像处理·人工智能·python·opencv·计算机视觉
草莓base21 分钟前
【手写一个spring】spring源码的简单实现--容器启动
java·后端·spring
mqiqe29 分钟前
Elasticsearch 分词器
python·elasticsearch
Ljw...36 分钟前
表的增删改查(MySQL)
数据库·后端·mysql·表的增删查改
编程重生之路37 分钟前
Springboot启动异常 错误: 找不到或无法加载主类 xxx.Application异常
java·spring boot·后端
薯条不要番茄酱37 分钟前
数据结构-8.Java. 七大排序算法(中篇)
java·开发语言·数据结构·后端·算法·排序算法·intellij-idea
不去幼儿园2 小时前
【MARL】深入理解多智能体近端策略优化(MAPPO)算法与调参
人工智能·python·算法·机器学习·强化学习
幽兰的天空3 小时前
Python 中的模式匹配:深入了解 match 语句
开发语言·python
网易独家音乐人Mike Zhou6 小时前
【卡尔曼滤波】数据预测Prediction观测器的理论推导及应用 C语言、Python实现(Kalman Filter)
c语言·python·单片机·物联网·算法·嵌入式·iot
安静读书6 小时前
Python解析视频FPS(帧率)、分辨率信息
python·opencv·音视频