如何在Django模板中按分类过滤数据并解决VariableDoesNotExist报错
错误原因
你遇到的VariableDoesNotExist报错核心原因有两个:
- 模板中调用过滤器时,
Featured没有加引号,Django会将其识别为需要从上下文读取的变量,而非字符串参数,而你的视图并没有传递名为Featured的变量到模板上下文,因此触发变量不存在的报错。 - 你模型中
category字段存储的是CATEGORY_CHOICES里的第一个元素(即缩写值),Featured分类对应的存储值是'F'而非显示名'Featured',就算你加了引号传'Featured'也过滤不到对应数据。
修复步骤
方法1:直接修改现有模板调用
- 给过滤器的分类参数加引号,改为传对应的缩写值
- 修正循环变量名,你循环体内用的变量是
item,不要把循环变量写成object_list
修改后的模板代码如下:
{% for item in object_list|in_category:'F' %} <!-- 原有模板渲染代码不变 --> {% endfor %}
其他分类的调用对应替换缩写值即可:
- 趋势商品对应
'TP' - 新品对应
'NA' - 特惠商品对应
'OS' - 畅销商品对应
'BS'
方法2(更推荐):视图层提前预处理分类数据
模板过滤器做过滤的性能不如视图层直接分好类再传到模板,你可以在首页视图中提前把各个分类的商品查询集准备好:
def home_view(request): context = { 'featured_items': Item.objects.filter(category='F'), 'trending_items': Item.objects.filter(category='TP'), 'new_arrival_items': Item.objects.filter(category='NA'), 'on_sale_items': Item.objects.filter(category='OS'), } return render(request, '你的首页模板路径.html', context)
模板里直接对应循环即可,不需要调用过滤器:
{% for item in featured_items %} <!-- 精选商品区块渲染代码 --> {% endfor %} {% for item in trending_items %} <!-- 趋势商品区块渲染代码 --> {% endfor %}
这种方式代码可读性更好,也避免了模板层做数据库查询的性能损耗。
内容的提问来源于stack exchange,提问作者Rahul Sahni
相关产品推荐
相关产品推荐

