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

Django中外键关联分类与商品,模板按分类展示报错求助

Django商品按分类分组展示的问题解决方法

错误原因分析

  • Django模板不支持直接用{% used_category = [] %}这种Python式的变量赋值和列表操作,模板语言有独立的语法规则,不能直接嵌入Python代码。
  • 模板中{% enfor %}是拼写错误,正确写法应为{% endfor %}。
  • 直接写item.category不会渲染变量值,必须用{{ item.category }}的模板变量语法。

推荐解决方案:视图层提前分组(高效简洁)

Django模板的核心原则是尽量少做业务逻辑,复杂的分组逻辑应该放在视图中处理,同时用预加载优化数据库查询。

1. 修改视图函数

from django.shortcuts import render
from .models import Category

def shop_items(request):
    # 预加载每个分类关联的所有商品,避免多次查询数据库
    categories = Category.objects.prefetch_related('shopitem_set').all()
    return render(request, 'your_template.html', {'categories': categories})

2. 模板代码实现分组展示

<table border="1">
    {% for category in categories %}
        <!-- 分类标题行 -->
        <tr>
            <td colspan="3"><strong>{{ category.category }}</strong></td>
        </tr>
        <!-- 遍历该分类下的所有商品 -->
        {% for item in category.shopitem_set.all %}
        <tr>
            <td></td>
            <td>{{ item.itemName }}</td>
            <td>{{ item.price }} 元</td>
        </tr>
        {% empty %}
        <!-- 分类下无商品时的提示 -->
        <tr>
            <td colspan="3">该分类暂无商品</td>
        </tr>
        {% endfor %}
    {% endfor %}
</table>

备选方案:使用模板regroup标签

如果不想修改视图,也可以用Django内置的regroup标签实现分组,但需要确保商品列表已按分类排序:

1. 修改视图函数(添加排序)

from django.shortcuts import render
from .models import ShopItem

def shop_items(request):
    # 按分类排序,保证regroup能正确分组
    shopitem_list = ShopItem.objects.all().order_by('category')
    return render(request, 'your_template.html', {'shopitem_list': shopitem_list})

2. 模板代码

{% regroup shopitem_list by category as category_groups %}

<table border="1">
    {% for group in category_groups %}
        <tr>
            <td colspan="3"><strong>{{ group.grouper.category }}</strong></td>
        </tr>
        {% for item in group.list %}
        <tr>
            <td></td>
            <td>{{ item.itemName }}</td>
            <td>{{ item.price }} 元</td>
        </tr>
        {% empty %}
        <tr>
            <td colspan="3">该分类暂无商品</td>
        </tr>
        {% endfor %}
    {% endfor %}
</table>

注意事项

  • 视图中使用prefetch_related可以避免N+1数据库查询问题,提升页面加载效率,优先推荐这种方式。
  • 模板中渲染变量必须用{{ 变量名 }},不能直接写变量标识符。
  • 模板不支持复杂的Python逻辑操作,如列表添加、条件判断中的集合操作,这类逻辑尽量移到视图或模型中处理。

内容的提问来源于stack exchange,提问作者Echo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:01:17