订单
提示:
-
订单入口 在《购物车》页面的《去结算》。
-
《去结算》后进入到《结算订单》页面,展示出要结算的商品信息。
结算订单是从Redis购物车中查询出被勾选的商品信息进行结算并展示。
创建orders子应用:
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 %}
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?
立即登录/注册


微信扫码登录