Python项目-Django-结算订单接口设计和定义

结算订单逻辑分析
结算订单是从Redis购物车中查询出被勾选的商品信息进行结算并展示

在这里插入图片描述
后端接口定义

class OrderSettlementView(LoginRequiredMixin, View):
    """结算订单"""
    def get(self, request):
        """提供订单结算页面"""
        return render(request, 'place_order.html')

结算订单后端逻辑实现

class OrderSettlementView(LoginRequiredMixin, View):
    """结算订单"""
    def get(self, request):
        """提供订单结算页面"""
        # 获取登录用户
       
        # 查询地址信息
       
        # 从Redis购物车中查询出被勾选的商品信息
      
        # 准备初始值
       
        # 查询商品信息
      
        # 补充运费
        
        # 渲染界面
        return render(request, 'place_order.html', context)

结算订单页面渲染

<h3 class="common_title">确认收货地址</h3>
<div class="common_list_con clearfix" id="get_site">
    <dl>
    {% if addresses %}
        <dt>寄送到:</dt>
        {% for address in addresses %}
        <dd @click="nowsite={{ address.id }}"><input type="radio" v-model="nowsite" value="{{ address.id }}">{{ address.province }} {{ address.city }} {{ address.district }}{{ address.receiver }} 收) {{ address.mobile }}</dd>
        {% endfor %}
    {% endif %}
    </dl>
    <a href="{{ url('users:address') }}" class="edit_site">编辑收货地址</a>
</div>
<h3 class="common_title">支付方式</h3>
<div class="common_list_con clearfix">
    <div class="pay_style_con clearfix">
        <input type="radio" name="pay_method" value="1" v-model="pay_method">
        <label class="cash">货到付款</label>
        <input type="radio" name="pay_method" value="2" v-model="pay_method">
        <label class="zhifubao"></label>
    </div>
</div>
<h3 class="common_title">商品列表</h3>
<div class="common_list_con clearfix">
    <ul class="goods_list_th clearfix">
        <li class="col01">商品名称</li>
        <li class="col02">商品单位</li>
        <li class="col03">商品价格</li>
        <li class="col04">数量</li>
        <li class="col05">小计</li>
    </ul>
    {% for sku in skus %}
    <ul class="goods_list_td clearfix">
        <li class="col01">{{loop.index}}</li>
        <li class="col02"><img src="{{ sku.default_image.url }}"></li>
        <li class="col03">{{ sku.name }}</li>
        <li class="col04"></li>
        <li class="col05">{{ sku.price }}</li>
        <li class="col06">{{ sku.count }}</li>
        <li class="col07">{{ sku.amount }}</li>
    </ul>
    {% endfor %}
</div>
<h3 class="common_title">总金额结算</h3>
<div class="common_list_con clearfix">
    <div class="settle_con">
        <div class="total_goods_count"><em>{{ total_count }}</em>件商品,总金额<b>{{ total_amount }}</b></div>
        <div class="transit">运费:<b>{{ freight }}</b></div>
        <div class="total_pay">实付款:<b>{{ payment_amount }}</b></div>
    </div>
</div>
<div class="order_submit clearfix">
    <a @click="on_order_submit" id="order_btn">提交订单</a>
</div>


<script type="text/javascript">
        let default_address_id = {{ user.default_address.id }};
        let payment_amount = {{ payment_amount }};
    </script>

结算订单

orders/ views.py

from django.shortcuts import render
from django.views import View
from django.contrib.auth.mixins import LoginRequiredMixin
from users.models import Address
from goods.models import SKU, SPU
from django_redis import get_redis_connection


class OrderSettlementView(LoginRequiredMixin, View):
    """结算订单"""
    def get(self, request):

        # 查询用户收货地址(没有被删除的)
        user = request.user
        try:
            addresses = Address.objects.filter(user=user, is_deleted=False)
        except Exception as e:
            addresses = None

        redis_conn = get_redis_connection('carts')
        # hash 所有的购物车数据 勾选和未勾选的{'b'1: 'b'2, 'b'2: 'b'3}
        # 查询所有的商品
        redis_cart = redis_conn.hgetall('cart_%s' % user.id)

        # set 被勾选的商品id {b'1'}
        # 被勾选的商品id
        redis_selected = redis_conn.smembers('selected_%s' % user.id)

        # 总计需要将商品数据重新构造出一个新的数据类型
        # new_cat_dict --> {b'1':b'2'}->被勾选的商品的个数(1号商品有2件)
        new_cart_dict = {}
        for sku_id in redis_selected:
            new_cart_dict[int(sku_id)] = int(redis_cart[sku_id])

        # 取出所有的keys
        sku_ids = new_cart_dict.keys()

        # 查询出所有被勾选的商品在SKU里
        skus = SKU.objects.filter(id__in=sku_ids)
        # print(skus)

        total_count = 0
        total_amount = 0
        for sku in skus:
            # 给sku添加数量和小计和属性
            sku.count = new_cart_dict[sku.id]
            sku.amount = sku.price * sku.count

            total_count += sku.count
            total_amount += sku.amount

        freight = 10
        context = {
            'addresses': addresses,
            'skus': skus,
            'total_count': total_count,       # 购物车商品总件数
            'total_amount': total_amount,       # 总金额
            'freight': freight,             # 运费
            'payment_amount': total_amount + freight,         # 实际付款
        }
        return render(request, 'place_order.html', context=context)

orders/ urls.py

# @Time:2021/4/3 18:17
# @Author:Ellen
# @File:urls.py

from django.urls import path
from . import views

app_name = 'orders'

urlpatterns = [
    # 展示订单
    path('orders/settlement/', views.OrderSettlementView.as_view(), name='settlement')
]

版权声明:本文为weixin_45905671原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。