Django模板中如何获取session值并仅渲染购物车所选尺码
解决方法
问题原因
你当前模板的问题是循环遍历了购物车cart的所有键值对,所以每个商品条目都会输出全部商品的尺码,只需要调用你写好的自定义过滤器直接获取当前商品对应的尺码即可。
操作步骤
- 加载自定义过滤器
首先确保存放过滤器的文件位于Django应用下的templatetags目录(该目录需包含__init__.py文件,且应用已在settings.py的INSTALLED_APPS中注册)。在cart.html模板的开头引入你的过滤器文件,比如过滤器文件名为cart_filters.py,则添加如下代码:
{% load cart_filters %}- 加载自定义过滤器
- 优化自定义过滤器(可选)
为避免购物车中不存在对应商品id时抛出KeyError异常,可对过滤器做兼容处理,同时注意session中存储的字典键为字符串类型,需要和商品id的类型匹配:
@register.filter def item_size(cart , item): return cart.get(str(item.id), "无匹配尺码")- 优化自定义过滤器(可选)
- 替换模板中的尺码渲染逻辑
删除原有循环遍历request.session.cart.items的代码,直接调用过滤器获取当前商品的尺码,修改后的模板代码如下:
<tbody style="margin-bottom: 20px;"> {% for item in items %} <tr> <th scope="row">{{forloop.counter}}</th> <td> <img src="{{item.first.url}}" alt="" height="100px"></td> <td>{{item.name}}</td> <!-- 调用自定义过滤器获取当前商品对应尺码 --> <td>{{ request.session.cart|item_size:item }}</td> <td>{{item.price|currency}}</td> <td> <a href="#">Remove</a> </td> </tr> {% endfor %} </tbody>- 替换模板中的尺码渲染逻辑
内容的提问来源于stack exchange,提问作者Shreyash mishra
相关产品推荐
相关产品推荐

