18.4 查看订单

发布于:2025-09-08 ⋅ 阅读:(21) ⋅ 点赞:(0)

分析

  1. 查看订单的本质是查询并在页面展示订单数据,根据之前提交订单的设计可知,订单涉及到基本订单信息和商品订单信息两个部分,所以需要从两张表查询数据。
  2. 因是查询,所以采用get方法,将查询到的数据展示在user_center_order.html模板。
  3. 订单属于用户数据,所以在users应用中的views.py中定义视图类UserOrderInfoView,继承LoginRequiredMixin,保证登录状态,并在其get方法中实现查看功能。

实现

users应用中的views.py中定义视图类UserOrderInfoView

class UserOrderInfoView(LoginRequiredMixin, View):

    def get(self, request, page_num):
        """提供我的订单页面"""
        user = request.user
        # 通过用户对象反向查询订单信息,[关联模型小写]_set是 Django 默认的反向关系管理器名称
        orders = user.orderinfo_set.all().order_by('-create_time')

        for order in orders:
            # 绑定订单状态
            order.status_name = OrderInfo.ORDER_STATUS_CHOICES[order.status - 1][1]
            # 绑定支付状态
            order.pay_method_name = OrderInfo.PAY_METHOD_CHOICES[order.pay_method - 1][1]

            order.sku_list = []
            # 正向查询订单商品
            order_goods = order.skus.all()
            for order_good in order_goods:
                sku = order_good.sku
                sku.count = order_good.count
                sku.amount = sku.price * sku.count
                order.sku_list.append(sku)
        # 分页处理
        page_num = int(page_num)
        try:
            paginator = Paginator(orders, constants.ORDERS_LIST_LIMIT)
            page_orders = paginator.page(page_num)
            total_page = paginator.num_pages
        except EmptyPage as e:
            return HttpResponseNotFound('订单不存在')

        context = {
            'page_orders': page_orders,
            'total_page': total_page,
            'page_num': page_num,
        }

        return render(request, 'user_center_order.html', context)

在users应用的urls.py中增加路由

path('orders/info/<int:page_num>/', views.UserOrderInfoView.as_view(), name='myorderinfo'),

user_center_order.html

{#<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">#}
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>小鱼商城-全部订单</title>
    <link rel="stylesheet" type="text/css" href="{{ static('css/jquery.pagination.css') }}">
    <link rel="stylesheet" type="text/css" href="{{ static('css/reset.css') }}">
    <link rel="stylesheet" type="text/css" href="{{ static('css/main.css') }}">
    <script type="text/javascript" src="{{ static('js/jquery-1.12.4.min.js') }}"></script>
    <script type="text/javascript" src="{{ static('js/vue-2.5.16.js') }}"></script>
    <script type="text/javascript" src="{{ static('js/axios-0.18.0.min.js') }}"></script>
</head>
<body>
<div id="app">
    <div class="header_con">
        <div class="header" v-cloak>
            <div class="welcome fl">欢迎来到小鱼商城!</div>
            <div class="fr">
                <div v-if="username" class="login_btn fl">
                    欢迎您:<em>[[ username ]]</em>
                    <span>|</span>
                    <a href="{{ url('users:logout') }}">退出</a>
                </div>
                <div v-else class="login_btn fl">
                    <a href="{{ url('users:login') }}">登录</a>
                    <span>|</span>
                    <a href="{{ url('users:register') }}">注册</a>
                    <a href="{{ url('users:register') }}">注册</a>
                </div>
                <div class="user_link fl">
                    <span>|</span>
                    <a href="{{ url('users:info') }}">用户中心</a>
                    <span>|</span>
                    <a href="{{ url('carts:info') }}">我的购物车</a>
                    <span>|</span>
                    <a href="{{ url('users:myorderinfo',args=(1,)) }}">我的订单</a>
                </div>
            </div>
        </div>
    </div>
    <div class="search_bar clearfix">
        <a href="{{ url('contents:index') }}" class="logo fl"><img src="{{ static('images/logo.png') }}"></a>
        <div class="search_wrap fl">
            <form method="get" action="/search/" class="search_con">
                <input type="text" class="input_text fl" name="q" placeholder="搜索商品">
                <input type="submit" class="input_btn fr" name="" value="搜索">
            </form>
            <ul class="search_suggest fl">
                <li><a href="#">索尼微单</a></li>
                <li><a href="#">优惠15元</a></li>
                <li><a href="#">美妆个护</a></li>
                <li><a href="#">买2免1</a></li>
            </ul>
        </div>
    </div>
    <div class="main_con clearfix">
        <div class="left_menu_con clearfix">
            <h3>用户中心</h3>
            <ul>
                <li><a href="{{ url('users:info') }}">· 个人信息</a></li>
                <li><a href="{{ url('users:address') }}">· 收货地址</a></li>
                <li><a href="{{ url('users:myorderinfo',args=(1,)) }}" class="active">· 全部订单</a></li>
                <li><a href="{{ url('users:resetpwd') }}">· 修改密码</a></li>
            </ul>
        </div>
        <div class="right_content clearfix">
            <h3 class="common_title2">全部订单</h3>
            {% for order in page_orders %}
                <ul class="order_list_th w978 clearfix">
                    <li class="col01">{{ order.create_time.strftime('%Y-%m-%d %H:%M:%S') }}</li>
                    <li class="col02">订单号:{{ order.order_id }}</li>
                </ul>
                <table class="order_list_table w980">
                    <tbody>
                    <tr>
                        <td width="55%">
                            {% for sku in order.sku_list %}
                                <ul class="order_goods_list clearfix">
                                    <li class="col01"><img src="/static/images/goods/{{ sku.default_image.url }}.jpg">
                                    </li>
                                    <li class="col02"><span>{{ sku.name }}</span></li>
                                    <li class="col03">{{ sku.count }}</li>
                                    <li class="col04">{{ sku.amount }}元</li>
                                </ul>
                            {% endfor %}
                        </td>
                        <td width="15%">{{ order.total_amount }}元<br>含运费:{{ order.freight }}元</td>
                        <td width="15%">{{ order.pay_method_name }}</td>
                        <td width="15%">
                            <a @click="oper_btn_click('{{ order.order_id }}', {{ order.status }})" class="oper_btn">{{
                                    order.status_name }}</a>
                        </td>
                    </tr>
                    </tbody>
                </table>
            {% endfor %}
            <div class="pagenation">
                <div id="pagination" class="page"></div>
            </div>
        </div>
    </div>
    <div class="footer">
        <div class="foot_link">
            <a href="#">关于我们</a>
            <span>|</span>
            <a href="#">联系我们</a>
            <span>|</span>
            <a href="#">招聘人才</a>
            <span>|</span>
            <a href="#">友情链接</a>
        </div>
        <p>CopyRight © 2024 北京小鱼商业股份有限公司 All Rights Reserved</p>
        <p>电话:010-****888 京ICP备*******8号</p>
    </div>
</div>
<script type="text/javascript" src="{{ static('js/common.js') }}"></script>
<script type="text/javascript" src="{{ static('js/user_center_order.js') }}"></script>
<script type="text/javascript" src="{{ static('js/jquery.pagination.min.js') }}"></script>
<script type="text/javascript">
    $(function () {
        $('#pagination').pagination({
            currentPage: {{ page_num }},
            totalPage: {{ total_page }},
            callback: function (current) {
                {#location.href = '/orders/info/1/';#}
                location.href = '/orders/info/' + current + '/';
            }
        })
    });
</script>
</body>
</html>

最后,将其它模板中注释掉的查看订单的语句释放掉,即可看到查询订单的效果。


网站公告

今日签到

点亮在社区的每一天
去签到