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

Django实现按Jeu分类展示对应Course项问题求助

解决Django模板按Jeu分类展示Course的问题

你的问题出在模板的判断条件上:course.jeu是Jeu模型的实例对象,而jeu.nom是字符串字段,两者类型不匹配,导致筛选逻辑完全失效。下面给出两种可行的解决方法:

方法一:修正模板中的判断逻辑

直接比较对象实例或者匹配对应的字段值,两种写法都可以:

写法1:直接比较Jeu对象(推荐,避免同名冲突)

{% for jeu in jeux %}
<h3>{{ jeu.nom }}</h3><br>
<div class="row row-cols-1 row-cols-md-3 g-4">
  {% for course in courses_a_venir %}
    {% if course.jeu == jeu %}
    <div class="col">
      <div class="card">
        <!--<img src="..." class="card-img-top" alt="...">-->
        <div class="card-body">
          <h5 class="card-title">{{ course.jeu.nom }}</h5>
          <p class="card-text">This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
        </div>
        <div class="card-footer">
          <small class="text-muted">{{ course.date_evenement }}</small>
        </div>
      </div>
    </div>
    {% endif %}
  {% endfor %}
</div><br>
{% endfor %}

写法2:匹配Jeu的名称字段

如果确定不会有同名Jeu,也可以用字符串匹配:

{% if course.jeu.nom == jeu.nom %}

方法二:优化视图查询(性能更优)

上面的模板嵌套循环会导致多次数据库查询,数据量大时性能很差。可以在视图中提前预取每个Jeu对应的即将到来的Course,直接传递分组好的数据给模板:

修改视图代码

from django.db.models import Prefetch
from datetime import datetime

def home(request):
    # 定义即将到来的课程查询集
    future_courses_query = Course.objects.filter(
        date_evenement__gte=datetime.today()
    ).order_by('date_evenement')
    
    # 预取每个Jeu对应的未来课程,存到courses_a_venir属性中
    jeux = Jeu.objects.prefetch_related(
        Prefetch('course_set', queryset=future_courses_query, to_attr='courses_a_venir')
    )
    
    courses_passees = Course.objects.filter(
        date_evenement__lt=datetime.today()
    ).order_by('-date_evenement')[:3]
    
    return render(request, 'base_site/home.html', {
        'title': 'Accueil',
        'jeux': jeux,
        'courses_passees': courses_passees
    })

模板简化写法

不用再嵌套筛选,直接遍历每个Jeu下的预取课程:

{% for jeu in jeux %}
<h3>{{ jeu.nom }}</h3><br>
<div class="row row-cols-1 row-cols-md-3 g-4">
  {% for course in jeu.courses_a_venir %}
  <div class="col">
    <div class="card">
      <!--<img src="..." class="card-img-top" alt="...">-->
      <div class="card-body">
        <h5 class="card-title">{{ course.jeu.nom }}</h5>
        <p class="card-text">This is a longer card with supporting text below as a natural lead-in to additional content. This content is a little bit longer.</p>
      </div>
      <div class="card-footer">
        <small class="text-muted">{{ course.date_evenement }}</small>
      </div>
    </div>
  </div>
  {% endfor %}
</div><br>
{% endfor %}

这种方法利用了Django的prefetch_related和Prefetch对象,把查询次数从N+1降到2次,性能提升明显,适合数据量较大的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 12:21:03