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

