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

概念

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

导入静态资源

在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 = 1if 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].nameorder["username"]=usernameitems = 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"] = itemsreturn 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.mzph.cn/bicheng/48375.shtml

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

相关文章

cs224w笔记(p5)

链接预测任务的两种类型&#xff1a;随机缺失边&#xff1b;随时间演化边。 第一种假设可以以蛋白质之间的交互作用举例&#xff0c;缺失的是研究者还没有发现的交互作用。 第二种假设可以以社交网络举例&#xff0c;随着时间流转&#xff0c;人们认识更多朋友。 基于相似性进…

zookeeper+kafka消息队列集群部署

一.消息队列 1、什么是消息队列 消息&#xff08;Message&#xff09;是指在应用间传送的数据。消息可以非常简单&#xff0c;比如只包含文本字符串&#xff0c;也可以更复杂&#xff0c;可能包含嵌入对象。 消息队列&#xff08;MessageQueue&#xff09;是一种在软件系统中用…

1、springboot3 vue3开发平台-后端-项目构建

文章目录 1. 创建项目1.1 前置环境条件1.2 项目创建 2. 模块配置2.1 父工程配置概述2.2 配置启动模块2.3 父工程相关依赖管理 1. 创建项目 1.1 前置环境条件 idea2023, jdk17 1.2 项目创建 创建父工程并删除不需要的文件目录&#xff1a; 右键父工程依次创建其他模块 最…

Windows 、Linux、MacOS 进程管理机制

本心、输入输出、结果 文章目录 Windows 、Linux、MacOS 进程管理机制前言Windows 进程管理机制Linux 进程管理macOS 进程管理内存不够了,几个操作系统如何处理Windows 、Linux、MacOS 进程管理机制 编辑 | 简简单单 Online zuozuo 地址 | https://blog.csdn.net/qq_15071263 …

【Qt】窗口

文章目录 QMainWindow菜单栏工具栏状态栏浮动窗口对话框自定义对话框Qt内置对话框QMessageBox QMainWindow Qt中的主窗口以QMainWindow表示&#xff0c;其总体结构如下&#xff1a; 菜单栏 菜单栏MenuBar&#xff0c;可包含多个菜单Menu&#xff0c;每个菜单也可以包含多个菜…

C语言 指针方法 输入一行文字,找出其中大写字母、小写字母、空格、数字以及其他字符各有多少

输入一行文字,找出其中大写字母、小写字母、空格、数字以及其他字符各有多少。 #include <stdio.h>void countCharacters(char *str, int *upper, int *lower, int *space, int *digit, int *other) {*upper = *lower = *space = *digit = *other = 0;while (*str != \0…

Java面试题系列 - 第17天

Java中的代理模式与动态代理 背景说明&#xff1a;代理模式是一种结构型设计模式&#xff0c;用于在客户端和目标对象之间提供一个代理或占位符。在Java中&#xff0c;动态代理技术允许在运行时创建代理对象&#xff0c;这在AOP&#xff08;面向切面编程&#xff09;和RPC&…

03 Git的基本使用

第3章&#xff1a;Git的基本使用 一、创建版本仓库 一&#xff09;TortoiseGit ​ 选择项目地址&#xff0c;右键&#xff0c;创建版本库 ​ 初始化git init版本库 ​ 查看是否生成.git文件&#xff08;隐藏文件&#xff09; 二&#xff09;Git ​ 选择项目地址&#xff0c…

【LeetCode】相同的树

目录 一、题目二、解法完整代码 一、题目 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1&#xff1a; 输入&#xff1a;p [1,2,3],…

FastGPT 知识库搜索测试功能解析

目录 一、代码解析 1.1 searchTest.ts 1.2 controller.ts 本文接上一篇文章FastGPT 知识库搜索测试功能解析 对具体代码进行解析。 一、代码解析 FastGPT 知识库的搜索测试功能主要涉及两个文件&#xff0c;分别是 searchTest.ts 和 controller.ts 文件&#xff0c;下面分…

【python】练习 10.5:访客簿 编写⼀个 while 循环,提⽰⽤户输⼊其名字。

练习 10.5&#xff1a;访客簿 编写⼀个 while 循环&#xff0c;提⽰⽤户输⼊其名字。 要求 收集⽤户输⼊的所有名字&#xff0c;将其写⼊ guest_book.txt&#xff0c;并确保这个⽂件中 的每条记录都独占⼀⾏。 代码 from pathlib import Pathpath Path(guest_book.txt) gu…

npm下载的依赖包版本号怎么看

npm下载的依赖包版本号怎么看 版本号一般分三个部分&#xff0c;主版本号、次版本号、补丁版本号。 主版本号&#xff1a;一般依赖包发生重大更新时&#xff0c;主版本号才回发生变化&#xff0c;如Vue2.x到Vue3.x。次版本号&#xff1a;当依赖包中发生了一些小变化&#xff…

运行springboot项目报错:java: java.lang.NoSuchFieldError: members_field

项目场景&#xff1a; 在idea中运行从git上拉取的基于springboot框架的项目运行报错 问题描述 运行spingboot项目报错 java: java.lang.NoSuchFieldError: members_field原因分析&#xff1a; 检查你所使用的java版本&#xff08;我这里是在idea上运行的&#xff0c;可以很直…

ArkTS语言---基础知识

ArkTS是一种为构建高性能应用而设计的编程语言。ArkTS在继承TypeScript语法的基础上进行了优化&#xff0c;以提供更高的性能和开发效率。目前流行的编程语言TypeScript是在JavaScript基础上通过添加类型定义扩展而来的&#xff0c;而ArkTS则是TypeScript的进一步扩展。TypeScr…

qt QScrollArea 可滚动区域控件简单举例

1.qt 滚动控件简单举例 在Qt中&#xff0c;滚动控件通常是通过QScrollArea来实现的。以下是一个简单的例子&#xff0c;展示了如何使用QScrollArea来创建一个滚动控件&#xff1a; #include <QApplication> #include <QWidget> #include <QVBoxLayout>…

DETR算法解读——Transformer在目标检测任务的首次应用

论文&#xff1a;End-to-End Object Detection with Transformers 作者&#xff1a;Nicolas Carion, Francisco Massa, Gabriel Synnaeve, Nicolas Usunier, Alexander Kirillov, Sergey Zagoruyko 机构&#xff1a;Facebook AI 链接&#xff1a;https://arxiv.org/abs/2005.12…

git教程, 命令行版

前言 git就是代码版本管理系统&#xff0c;很简单的作用就是每一次commit之后&#xff0c;修改文件都是跟上一次commit的仓库文件做对比&#xff0c;也可以调出历史的文件查看某次commit修改了什么东西 0环境准备&#xff1a; 安装git, 百度一下&#xff0c;然后打开cmd&…

Django 执行原生SQL

在Django中&#xff0c;你可以使用Raw SQL queries来执行原生的SQL查询。这对于需要进行复杂查询或Django的ORM无法满足的查询非常有用。 1&#xff0c;添加模型 Test/app11/models.py from django.db import modelsclass Post(models.Model):title models.CharField(max_le…

视频压缩文件太大了怎么缩小?怎么压缩视频大小?视频压缩方法:10个!(宝藏)

视频压缩文件太大了怎么缩小&#xff1f;让我看看是谁下班之后不是一手刷手机短视频&#xff0c;顺便葛优躺在沙发上的&#xff1f;互联网发展到现在&#xff0c;视频已成为我们生活中不可或缺的一部分。不管是视频录制还是视频缓存&#xff0c;视频文件体积越来越庞大&#xf…

C++中size_t怎么用

size_t是C标准库中定义的一种无符号整型数据类型&#xff0c;通常用于表示大小或数量&#xff0c;如数组的长度、容器的大小或指针算术。size_t类型确保了跨平台的一致性&#xff0c;使得代码更加健壮和可移植。 size_t定义在<cstddef>头文件中&#xff0c;因此在使用之…