如何在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
相关产品推荐
相关产品推荐

