您当前的位置: 首页 > 

IT之一小佬

暂无认证

  • 0浏览

    0关注

    1192博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

美多商城之订单(结算订单)

IT之一小佬 发布时间:2021-07-15 20:13:20 ,浏览量:0

订单

提示:

  • 订单入口 在《购物车》页面的《去结算》。

  • 《去结算》后进入到《结算订单》页面,展示出要结算的商品信息。

一、结算订单

1.1.1. 结算订单逻辑分析

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

创建orders子应用:

1.1.2. 结算订单接口设计和定义

1.请求方式

选项方案请求方法GET请求地址/orders/settlement/

总路由:

#  orders
    url(r'^', include('orders.urls', namespace='orders')),

子路由:

from . import views
from django.conf.urls import url

urlpatterns = [
    #  结算订单
    url(r'^orders/settlement/$', views.OrderSettlementView.as_view(), name='settlement'),

]

2.请求参数:

3.响应结果:HTML

place_order.html

4.后端接口定义

from django.shortcuts import render
from django.views import View
from django.contrib.auth.mixins import LoginRequiredMixin


# Create your views here.
class OrderSettlementView(LoginRequiredMixin, View):
    """结算订单"""

    def get(self, request):
        """提供订单结算页面"""
        return render(request, 'place_order.html')
1.1.3. 结算订单后端逻辑实现
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
from decimal import Decimal
from django_redis import get_redis_connection


# Create your views here.
class OrderSettlementView(LoginRequiredMixin, View):
    """结算订单"""

    def get(self, request):
        """提供订单结算页面"""
        # 获取登录用户
        user = request.user
        # 查询地址信息
        try:
            #  查询登录用户没有被删除的收货地址
            addresses = Address.objects.filter(user=user, is_deleted=False)
        except Address.DoesNotExist:
            # 如果地址为空,渲染模板时会判断,并跳转到地址编辑页面
            addresses = None

        # 从Redis购物车中查询出被勾选的商品信息
        redis_conn = get_redis_connection('carts')
        redis_cart = redis_conn.hgetall('carts_%s' % user.id)  # 查询所有的购物车数据
        cart_selected = redis_conn.smembers('selected_%s' % user.id)  # 被勾选的商品
        cart = {}  # 构造购物车中被勾选的商品的数据
        for sku_id in cart_selected:
            cart[int(sku_id)] = int(redis_cart[sku_id])

        # 准备初始值
        total_count = 0
        total_amount = Decimal(0.00)  # 这里面加不加引号都是一样的
        # 查询商品信息
        skus = SKU.objects.filter(id__in=cart.keys())
        for sku in skus:
            sku.count = cart[sku.id]
            sku.amount = sku.count * sku.price
            # 计算总数量和总金额
            total_count += sku.count
            total_amount += sku.count * sku.price
        # 补充运费
        freight = Decimal('10.00')

        # 渲染界面
        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)
4.结算订单页面渲染

place_order.html

确认收货地址
{% if addresses %} 寄送到: {% for address in addresses %}
关注
打赏
1665675218
查看更多评论
0.0383s