本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习

https://www.bilibili.com/video/BV1vt41147K8?p=1

用户中心-订单页面展示

编辑user/view.py文件,新增类UserOrderView

class UserOrderView(LoginRequiredMixin, View):
'''用户中心订单类'''
template_name = 'user/user_center_order.html'
context = {'type': ''} def get(self, request, page_num):
'''显示用户订单'''
self.context['type'] = 'order'
user = request.user
# 获取订单信息
orders = OrderInfo.objects.filter(user=user).order_by('-create_time')
# 遍历订单头
for order in orders:
order_goods_list = OrderGoods.objects.filter(order=order)
# 动态给order增加属性
order.order_goods_list = order_goods_list
order.status_name = OrderInfo.ORDER_STATUS_DIC[order.order_status]
order.method_name = OrderInfo.PAY_METHOD_DIC[str(order.pay_method)]
# 遍历订单行
for order_goods in order_goods_list:
# 动态给order_goods增加属性
order_goods.amount = order_goods.price * order_goods.count # 分页
# 创建Paginator对象
paginator = Paginator(orders, 3)
total_page = paginator.num_pages
# 校验参数页码
if page_num > total_page:
page_num = 1
# 获取Page对象
page = paginator.page(page_num)
# 页码,页面上最多显示3页
if total_page < 3:
pages = range(1, total_page + 1)
elif page_num < 2:
pages = range(1, 4)
elif page_num > total_page - 1:
pages = range(total_page-2, total_page+1)
else:
pages = range(page_num-1, page_num + 2)
# 组织上下文
self.context['page'] = page
self.context['pages'] = pages
return render(request, self.template_name, self.context)

1. 获取登录用户的订单头orders,循环遍历头,获取头下面对应的订单行order_goods,处理这种将头行结构传给模板时,可以先遍历头,然后查询出头下面的行,将返回的查询结果集当做一个属性,添加给头。这样只需要将头传递给模板文件即可

# 遍历头
for header in headers:
# 查询行结果集
lines = Line.objects.filter(header=header)
# 将行结果集当做属性添加给头
header.lines = lines
# 将数据传递给模板文件
return render(request, template_name, {'headers': headers})
...
# 在模板文件中遍历头行
{% for header in headers %}
....
  {% for line in header.lins %}
  ...
  {% end for %}
{% end for %}

2. 分页,在url中加入参数<int:pag_num>,展示具体第几页:

  • 导入分页模块:from django.core.paginator import Paginator
  • 根据订单头创建分页对象,每页显示三个订单:paginator = Paginator(orders, 3)
  • 校验url页码参数,若有误则将页码变量重置为第一页
  • 获取页码页面的page对象:page = paginator.page(page_num)
  • 设置页面下方页码列表的展示,如只展示5个页码
# 页码,页面上最多显示5页
# 显示的最小页码
min_page = page_num - 2
# 显示的最大页码
max_page = page_num + 2
# 若最小页码小于1,则设置最小页码为1
# 并将小于的值加在最大页码上,保证最小页码到最大页码有5页
diff = min_page - 1
if diff < 0:
min_page = 1
max_page -= diff
# 若最大页码大于总页数,则设置最大页码为总页数
# 并将大于的值减在最小页码上,保证最小页码到最大页码有5页
diff = max_page - total_page
if diff > 0:
max_page = total_page
min_page -= diff
# 设置显示的页码范围
pages = range(min_page, max_page + 1)

组织上下文,将page对象和页码列表传给模板:

# 组织上下文
self.context['page'] = page
self.context['pages'] = pages
return render(request, self.template_name, self.context)

编辑url和模板文件

{% extends 'base_user_center.html' %}
{% load static %}
{% block right %}
<div class="right_content clearfix">
<h3 class="common_title2">全部订单</h3>
{% for order in page %}
<ul class="order_list_th w978 clearfix">
<li class="col01">{{ order.create_time }}</li>
<li class="col02">{{ order.order_num }}</li>
<li class="col02 stress">{{ order.status_name }}</li>
</ul> <table class="order_list_table w980">
<tbody>
<tr>
<td width="55%">
{% for order_goods in order.order_goods_list %}
<ul class="order_goods_list clearfix">
<li class="col01"><a href="{% url 'goods:detail' order_goods.goods.id %}"><img src="{{ order_goods.goods.image.url }}"></a></li>
<li class="col02"><a href="{% url 'goods:detail' order_goods.goods.id %}">{{ order_goods.goods.name }}<em>{{ order_goods.goods.price }}元/{{ order_goods.goods.uom }}</em></a></li>
<li class="col03">{{ order_goods.count }}</li>
<li class="col04">{{ order_goods.amount }}</li>
</ul>
{% endfor %}
</td>
<td width="15%">{{ order.total_amount|add:order.transit_amount }}元(含运费)</td>
<td width="15%" class="status">{{ order.status_name }}</br>支付方式:{{ order.method_name }}</td>
{% csrf_token %}
<td width="15%"><a href="#" order_id='{{ order.id }}' order_status='{{ order.order_status }}' status_name='{{ order.status_name }}'pay_method='{{ order.pay_method }}' class="oper_btn">去付款</a></td>
</tr>
</tbody>
</table>
{% empty %}
暂无订单
{% endfor %} <div class="pagenation">
{% if page.has_previous %}
<a href="{% url 'user:order' page.previous_page_number %}"><上一页</a>
{% endif %}
{% for num in pages %}
<a href="{% url 'user:order' num %}" {% if num == page.number %}class="active"{% endif %}>{{ num }}</a>
{% endfor %}
{% if page.has_next %}
<a href="{% url 'user:order' page.next_page_number %}">下一页></a>
{% endif %}
</div>
</div>
{% endblock right %}

DJANGO-天天生鲜项目从0到1-012-订单-用户订单页面的更多相关文章

  1. django天天生鲜项目

    .后台admin管理天天生鲜商品信息 models里 from django.db import modelsfrom tinymce.models import HTMLField #需要pip安装 ...

  2. DJANGO-天天生鲜项目从0到1-010-购物车-购物车操作页面(勾选+删改)

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  3. DJANGO-天天生鲜项目从0到1-007-首页静态化与缓存

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  4. python 天天生鲜项目

    python 天天生鲜项目 django版:https://github.com/Ivy-1996/fresh flask版:https://github.com/Ivy-1996/flask-fre ...

  5. Django之天天生鲜项目

    准备工作 1.配置settings.py内置文件 注意: AUTH_USER_MODEL配置参数要在第一次迁移数据库之前配置,否则可能django的认证系统工作不正常 2.创建应用 3.配置主路由 一 ...

  6. DJANGO-天天生鲜项目从0到1-011-订单-订单提交和创建

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  7. DJANGO-天天生鲜项目从0到1-009-购物车-Ajax实现添加至购物车功能

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  8. DJANGO-天天生鲜项目从0到1-009-搜索功能实现(django-haystack+whoosh+jieba)

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

  9. DJANGO-天天生鲜项目从0到1-006-首页-内容展示

    本项目基于B站UP主‘神奇的老黄’的教学视频‘天天生鲜Django项目’,视频讲的非常好,推荐新手观看学习 https://www.bilibili.com/video/BV1vt41147K8?p= ...

随机推荐

  1. 35 _ 队列1 _ 什么是队列.swf

    队列是一种可以实现一个先进先出的存储结构 什么是队列? 队列(Queue)也是一种运算受限的线性表.它只允许在表的一端进行插入,而在另一端进行删除.允许删除的一端称为队头(front),允许插入的一端 ...

  2. ImageLoader在Gridview中的使用

    原理和ImageLoader在Listview中的使用一样,只有下面的几点变化 主页面的布局 <?xml version="1.0" encoding="utf-8 ...

  3. 实战:IDEA运行速度调优

    序言 可能大家觉得系统调优一般都是针对服务端应用而言的,普通Java开发人员很少有机会实践.今天就通用一个Java开发人员日常工作中经常使用的开发工具开做一次调优实战. 我在日常工作中的主要IDE工具 ...

  4. MVC+EFCore 项目实战-数仓管理系统1

    项目背景及需求说明 这是一个数据管理"工具类"的系统,计划有三个核心功能: 1.通过界面配置相关连接字符串,查询数据库的表数据. 2.配置相关模板,生成数据库表. 可以界面填报或通 ...

  5. Python之浅谈绑定方法

    目录 绑定方法和非绑定方法 绑定方法 对象的绑定方法 类的绑定方法 非绑定方法 总结 绑定方法和非绑定方法 类中定义的方法大致可以分为两类:绑定方法和非绑定方法.其中绑定方法又可以分为绑定到对象的方法 ...

  6. 【科普】Scrum——从橄榄球争球到敏捷开发

    对敏捷开发Scrum稍有了解的都知道Scrum来源于橄榄球,但你知道为何要以这项球类运动的术语来命名这个敏捷开发方法论吗? Scrum与橄榄球对应关系 Scrum 一词源于英式橄榄球运动,是指双方球员 ...

  7. 二.drf之使用序列化编写视图

    总结:两功能序列化: a.拿到queryset --->idc = Idc.objects.all() b.将queryset给序列化成类---->serializer = IdcSeri ...

  8. 个人对于flask中蓝图的理解

    什么是蓝图? 蓝图可以理解为,是一种对项目中的代码进行模块化管理的工具,相当于python中的包为什么要使用蓝图? 在一个py文件中具有多个功能代码,不利于维护和管理. 如果在其他的模块中去调用视图函 ...

  9. 你还在担心rpc接口超时吗

    在使用dubbo时,通常会遇到timeout这个属性,timeout属性的作用是:给某个服务调用设置超时时间,如果服务在设置的时间内未返回结果,则会抛出调用超时异常:TimeoutException, ...

  10. SpringMVC+Spring+Hibernate个人家庭财务管理系统

    项目描述 Hi,大家好,今天分享的项目是<个人家庭财务管理系统>,本系统是针对个人家庭内部的财务管理而开发的,大体功能模块如下: 系统管理模块 验证用户登录功能:该功能主要是验证用户登录时 ...