需求描述
在产品页面点击“加入购物车”,将界面上的“加入购物车”按钮变为灰色不可点击状态。
需求分析
点击按钮后,访问地址/foreaddCart,导致AddCartView类被调用,urls文件配置如下:
# 加入购物车
url(r'^foreaddCart/$', AddCartView.as_view(), name="addCart")
在AddCartView中重写get方法,步骤和点击“立即购买”一样,但返回不同(立即购买,返回的时渲染的提交订单页面)
class AddCartView(View):
def get(self, request):
item_id = request.GET.get("pid", "")
num = request.GET.get("num", "")
item = Product.objects.get(id=int(item_id))
user = request.user
found = False
all_oi = OrderItem.objects.filter(user_id=user.id, order_id__isnull=True)
for oi in all_oi:
if oi.product.id == item.id:
oi.number += int(num)
oi.save()
found = True
if not found:
oi = OrderItem()
oi.user = user
oi.number = num
oi.product = item
oi.save()
# return HttpResponse(json.dumps(res), content_type='application/json')
- 首先是获取参数pid和num(其中num由js控制),根据pid找到相应的产品,找到user对象。
- 如果已经存在这个产品对应的OrderItem,并且没有生成订单,就应该在对应的OrderItem基础上,调整数量。
- 基于用户对象user,查询没有生成订单的订单项集合
- 遍历集合,找到一样的产品,追加数量。
- 更新到数据库
- 要是没找到对应的orderItem,那么就新增一个订单项OrderItem
- 生成新订单项,设置用户、产品和数量
- 更新到数据库
- 返回一个字符串,这里涉及到Django传递数据给js
Django传递数据给js
网上查找教程
原文地址
已知两种方式:
- 页面加载完成时,在页面上操作,在页面上通过ajax方法得到新的数据(再向服务器发送一次请求)并显示在网页上,适用于页面不刷新的情况,动态加载内容。比如用户输入一个值或者点击某个位置,动态将相应的内容显示在网页上。
- 直接在试图函数(view.py中的函数)中渲染一个list或dict的内容,和网页其他部分一起显示在网页上,(一次性的渲染,还是同一次请求)
在此我使用第一种方式。