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

如何在Django中实现单分类下展示多个菜品?

解决方案

方法一:优化视图+修改模板(推荐,减少数据库查询)

1. 更新views.py

用prefetch_related预加载每个分类对应的菜品,避免多次查询数据库:

def gerechten(request):
    template = loader.get_template('café/gerechten.html')
    # 预加载分类关联的所有菜品
    mycategories = gerechten_Categorie.objects.prefetch_related('gerecht_info_set').all()

    context = {
        'mycategories': mycategories
    }   
    return HttpResponse(template.render(context, request))

2. 修改gerechten.html模板

先遍历分类,再在每个分类下遍历对应的菜品:

{% if mycategories %}
{% for category in mycategories %}
    {% with dishes=category.gerecht_info_set.all %}
        {% if dishes %}
        <div class="flex">
            <div class="menu-head center">
                <h2>{{ category.categorie }}</h2>
            </div>
            {% for dish in dishes %}
            <div class="menu-item">
                <ul class="price">
                    <li>{{ dish.gerecht_name }}</li>
                    <li>€{{ dish.gerecht_price }}</li>
                </ul>
                {% if dish.gerecht_description %}
                <p>{{ dish.gerecht_description }}</p>
                {% else %}
                <p></p>
                {% endif %}
            </div>
            {% endfor %}
        </div>
        {% endif %}
    {% endwith %}
{% endfor %}
{% else %}
<div class="menu-head center">
<h2>no items available</h2>
</div>
{% endif %}

方法二:仅修改模板(无需改动视图)

如果不想调整视图逻辑,直接在模板中利用Django的反向关联(但会触发多次数据库查询,数据量大时不推荐):

{% if mycategories %}
{% for category in mycategories %}
    {% with dishes=category.gerecht_info_set.all %}
        {% if dishes %}
        <div class="flex">
            <div class="menu-head center">
                <h2>{{ category.categorie }}</h2>
            </div>
            {% for dish in dishes %}
            <div class="menu-item">
                <ul class="price">
                    <li>{{ dish.gerecht_name }}</li>
                    <li>€{{ dish.gerecht_price }}</li>
                </ul>
                {% if dish.gerecht_description %}
                <p>{{ dish.gerecht_description }}</p>
                {% else %}
                <p></p>
                {% endif %}
            </div>
            {% endfor %}
        </div>
        {% endif %}
    {% endwith %}
{% endfor %}
{% else %}
<div class="menu-head center">
<h2>no items available</h2>
</div>
{% endif %}

补充说明

  • 反向关联名称:Django默认用[模型名小写]_set作为反向关联,比如这里的gerecht_info_set。如果想自定义名称,可以在gerecht_info模型的ForeignKey字段里加related_name参数,例如:categorie = models.ForeignKey(gerechten_Categorie, on_delete=models.CASCADE, related_name='dishes'),之后就能用category.dishes代替category.gerecht_info_set。
  • prefetch_related:专门用于一对多关系中预加载关联数据,能大幅减少数据库查询次数,提升页面加载效率。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:51:03