You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Django模板中按分类过滤数据并解决VariableDoesNotExist报错

错误原因

你遇到的VariableDoesNotExist报错核心原因有两个:

  1. 模板中调用过滤器时,Featured没有加引号,Django会将其识别为需要从上下文读取的变量,而非字符串参数,而你的视图并没有传递名为Featured的变量到模板上下文,因此触发变量不存在的报错。
  2. 你模型中category字段存储的是CATEGORY_CHOICES里的第一个元素(即缩写值),Featured分类对应的存储值是'F'而非显示名'Featured',就算你加了引号传'Featured'也过滤不到对应数据。

修复步骤

方法1:直接修改现有模板调用

  1. 给过滤器的分类参数加引号,改为传对应的缩写值
  2. 修正循环变量名,你循环体内用的变量是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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.30 07:54:03