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

news2024/9/17 7:11:22

概念

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

导入静态资源

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

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

订单列表

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

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

path('a_index/', viewsAdmin.admin_index),

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

def admin_index(request):
    return render(request,"adminTemp/index.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>

后台管理首页代码如下

<!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文件中定义该请求地址

path('admin/order_list/',viewsAdmin.order_list),

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

# 处理订单管理的列表页面请求
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})
<!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文件中接收该请求

path('admin/order_status/',viewsAdmin.order_status),

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

# 处理订单状态请求
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文件中定义接收该请求的地址

path('admin/order_delete/',viewsAdmin.order_delete),

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

# 处理删除订单请求
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/")

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1937616.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Nginx(详解以及如何使用)

目录 1. 什么是Nginx&#xff1f; 2. 为什么使用nginx? 3. 安装nginx 3.1 安装nginx的依赖插件 3.2 下载nginx 3.3 创建一个目录作为nginx的安装路径 3.4 解压 3.5 进入解压后的目录 3.6 指定nginx的安装路径 3.7 编译和安装nginx 3.8 启动nginx 3.9 访问nginx 4. ngin…

Python PDF Magic:合并和拆分随心所欲

大家好&#xff01;小编今天要为大家带来一篇关于Python操作PDF的秘籍——无论是要将PDF合并成一份整体&#xff0c;还是将一个庞大的PDF文件拆分成多个小伙伴&#xff0c;都轻松hold住&#xff01;你准备好了吗&#xff1f;让我们开始这场奇妙的PDF操作之旅吧&#xff01; 准…

Kubernetes 1.24 版弃用 Dockershim 后如何迁移到 containerd 和 CRI-O

在本系列的上一篇文章中&#xff0c;我们讨论了什么是 CRI 和 OCI&#xff0c;Docker、containerd、CRI-O 之间的区别以及它们的架构等。最近&#xff0c;我们得知 Docker 即将从 kubernetes 中弃用&#xff01;&#xff08;查看 kubernetes 官方的这篇文章&#xff09;那么让我…

springboot实现接口请求日志自动生成(日志自动埋点)

文章目录 1.作用&#xff1a;2.原理&#xff1a;3.代码&#xff1a;一.config层二. mq层 &#xff1a;三.service层&#xff1a; 4.效果图5.声明 1.作用&#xff1a; springboot接口请求日志自动生成&#xff0c;实现接口日志自动埋点生成 1.统一日志生成格式;—方便查看 2.汇…

day2 数组

977.有序数组的平方 有负数。暴力快排&#xff1a;先对每个元素平方 o(n)&#xff0c;再快排o&#xff08;nlogn&#xff09;&#xff08;先分区 o(n)&#xff0c;再递归排序 递归深度 logn&#xff09; class Solution:def sortedSquares(self, nums: List[int]) -> List…

控制欲过强的Linux小进程

控制欲强?视奸&#xff1f;普通人那才叫视奸&#xff0c;您是皇帝&#xff0c;天下大事无一逃过您的耳目&#xff0c;您想看什么就看什么&#xff0c;臣怀疑他在朋友圈私养兵士&#xff0c;囤积枪甲&#xff0c;蓄意谋反&#xff0c;图谋皇位啊&#xff01; 哈哈哈哈开个玩笑&…

C++ 类和对象 构造函数(下)

一 初始化列表&#xff1a; 1.1 构造函数体赋值&#xff1a; 在C中&#xff0c;构造函数用于创建对象并赋予其初始值。通常&#xff0c;我们可以在构造函数体内对成员变量进行赋值&#xff1a; class Date { public:Date(int year, int month, int day) {_year year;_mont…

常见的数据分析用例 —— 信用卡交易欺诈检测

文章目录 引言数据集分析1. 读入数据并快速浏览2.计算欺诈交易占数据集中交易总数的百分比3. 类别不平衡对模型的影响3.1 总体思路&#xff08;1&#xff09;数据的划分&#xff08;2&#xff09;训练模型&#xff08;3&#xff09;测试模型&#xff08;4&#xff09;解决不平衡…

知迪科技发布了全新软件产品

近日&#xff0c;知迪科技发布了全新软件产品——Vehicle Bus Tool-Trace Version免费版。该软件产品能高效的离线分析汽车总线数据&#xff0c;并拥有一大亮点功能&#xff1a;Ethernet通信离线文件基于ARXML文件的信号级解析&#xff0c;具体操作如下&#xff1a; 1、新建一…

git修改提交姓名

git config --global user.name “新用户名” git config --global user.email “新邮箱地址” 修改提交的用户名 git config --global user.name “yu***”

java转义文本中的HTML字符为安全的字

java转义文本中的HTML字符为安全的字 &#xff0c;以下字符被转义&#xff1a;替换为 (&apos; doesnt work in HTML4) " 替换为 &quot; & 替换为 &amp; < 替换为 < > 替换为 >1.先添加hutool依赖到pom <dependency><groupId>cn…

Docker安装笔记

1. Mac安装Docker 1.1 Docker安装包下载 1.1.1 阿里云 对于10.10.3以下的用户 推荐使用 对于10.10.3以上的用户 推荐使用 1.1.2 官网下载 系统和芯片选择适合自己的安装包 1.2 镜像加速 【推荐】阿里镜像 登陆后&#xff0c;左侧菜单选中镜像加速器就可以看到你的专属地…

阿尔泰科技利用485模块搭建自动灌溉系统实现远程控制

自动灌溉系统又叫土壤墒情监控系统&#xff0c;土壤墒情监控系统主要实现固定站无人值守情况下的土壤墒情数据的自动采集和无线传输&#xff0c;数据在监控中心自动接收入库&#xff1b;可以实现24小时连续在线监控并将监控数据通过有线、无线等传输方式实时传输到监控中心生成…

怎样在 PostgreSQL 中实现数据的异地备份?

&#x1f345;关注博主&#x1f397;️ 带你畅游技术世界&#xff0c;不错过每一次成长机会&#xff01;&#x1f4da;领书&#xff1a;PostgreSQL 入门到精通.pdf 文章目录 怎样在 PostgreSQL 中实现数据的异地备份&#xff1f;一、异地备份的重要性二、PostgreSQL 中的备份方…

Docker的安装【虚拟机】

Docker的安装【虚拟机】 准备环节【可跳过】 # 进入yum.repos.d目录&#xff0c;保留base.repo 和 CentOs-Base.repo&#xff0c;其余删除 cd /etc/yum.repos.d/ ----------------------------------------------------- # 现将base.repo 和 CentOs-Base.repo 存放至bak包中 …

SQL执行流程、SQL执行计划、SQL优化

select查询语句 select查询语句中join连接是如何工作的&#xff1f; 1、INNER JOIN 返回两个表中的匹配行。 2、LEFT JOIN 返回左表中的所有记录以及右表中的匹配记录。 3、RIGHT JOIN 返回右表中的所有记录以及左表中的匹配记录。 4、FULL OUTER JOIN 返回左侧或右侧表中有匹…

深度洞察市场需求,Vatee万腾平台定制化解决方案引领潮流

在当今这个日新月异的商业环境中&#xff0c;深刻理解并精准把握市场需求&#xff0c;已成为企业生存与发展的核心要义。Vatee万腾平台&#xff0c;作为行业内的佼佼者&#xff0c;凭借其卓越的定制化解决方案能力&#xff0c;正引领着市场潮流&#xff0c;为企业客户量身打造数…

【BUG】已解决:AttributeError: ‘DataFrame‘ object has no attribute ‘append‘

已解决&#xff1a;AttributeError: ‘DataFrame‘ object has no attribute ‘append‘ 目录 已解决&#xff1a;AttributeError: ‘DataFrame‘ object has no attribute ‘append‘ 【常见模块错误】 错误原因&#xff1a; 解决办法&#xff1a; 欢迎来到英杰社区https:/…

Linux—KVM虚拟化中(虚拟机克隆,快照,还原,删除)等应用实例

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f427;Linux基础知识(初学)&#xff1a;点击&#xff01; &#x1f427;Linux高级管理防护和群集专栏&#xff1a;点击&#xff01; &#x1f510;Linux中firewalld防火墙&#xff1a;点击&#xff01; ⏰️创作…

【数据结构初阶】顺序表三道经典算法题(详解+图例)

Hello&#xff01;很高兴又见到你了~~~ 看看今天要学点什么来充实大脑吧—— 目录 1、移除元素 【思路图解】 【总结】 2、删除有序数组中的重复项 【思路图解】 【总结】 3、合并两个有序数组 【思路图解】 【总结】 至此结束&#xff0c;Show Time&#xff01; 1、…