概念
前面通过多篇文章以完全实现了用户在网上蛋糕商城平台上的所有功能和操作,从本文开始,实现网站的后台管理功能的介绍和操作。
导入静态资源
在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/")