Django视图无法传值到模板,如何获取Order模型的订单项与总金额
问题根因
- 你视图中调用
Order.objects.values()返回的是字典格式的QuerySet集合,不是单个Order模型实例,所以直接调用{{ order.total }}无法读取到对应属性 - 你没有对订单做过滤,查询结果会包含所有用户的所有订单,不符合购物车只取当前用户未下单订单的业务逻辑
values()方法返回的字典不会包含多对多关联字段数据,你后续也无法通过它获取关联的OrderItem内容
修复步骤
1. 调整视图逻辑
修改views.py中的cart视图,取当前登录用户的对应订单,直接返回模型实例而非values结果:
from django.contrib.auth.decorators import login_required # 加登录校验装饰器,避免未登录用户访问时报错 @login_required def cart(request): # 取当前用户的未下单订单,不存在就新建 order, _ = Order.objects.get_or_create( order_user=request.user, ordered=False ) # 预加载关联的订单项、商品数据,避免后续查询产生N+1问题 order = Order.objects.prefetch_related('order_items__order_item').get(id=order.id) context = {'order': order} return render(request, 'shop/cart.html', context)
2. 调整模板取值逻辑
修改cart.html,直接读取Order实例的属性,循环遍历多对多关联的订单项:
{% extends 'shop/base.html' %} {% block content %} <div class="container"> {% include 'shop/navbar.html' %} <div> <p>订单总金额:{{ order.total }}</p> <p>是否已支付:{{ order.ordered|yesno:"是,否" }}</p> <h4>商品列表:</h4> <ul> {% for order_item in order.order_items.all %} <li> 商品名:{{ order_item.order_item.title }} 单价:{{ order_item.order_item.price }} 购买数量:{{ order_item.quantity }} 单项合计:{% widthratio order_item.order_item.price 1 order_item.quantity %} </li> {% empty %} <li>购物车暂无商品</li> {% endfor %} </ul> </div> </div> {% endblock content %}
补充说明
如果你确实需要查询多个订单返回QuerySet,模板侧需要先遍历QuerySet再读取每个订单的属性:
{% for ord in order %} <p>订单{{ ord.id }}总金额:{{ ord.total }}</p> {% endfor %}
内容的提问来源于stack exchange,提问作者user16476339
相关产品推荐
相关产品推荐

