所以我试图在一个模板中渲染我的模型,但只有一个小东西显示的次数超出了我的预期。我只想让类别名称在很多讲座中展示一次。我只是想知道修改模板代码的位置。
<ul>
{% for a in categories %}
{% for c in lectures %}
{% if a == c.course_category %}
<li><strong>{{ a.course_category }}</strong></li>
{% endif %}
{% if a == c.course_category %}
<li>{{ c.lecture_title }}</li>
<li>{{ c.content }}</li>
{% if c.link %}
<li>{{ c.link }}</li>
{% endif %}
{% if c.file %}
<li><a href='{{ MEDIA_URL }}{{ c.file.url }}'>download</a></li>
{% endif %}
{% endif %}
{% endfor %}
<hr/>
{% endfor %}
</ul>
答案 0 :(得分:2)
您应该将{{ a.course_category }}
移出内循环,这样您只需为每个类别显示一次。
{% for a in categories %}
<li><strong>{{ a.course_category }}</strong></li>
{% for c in lectures %}
<li>{{ lecture.lecture_title }}</li>
{% endfor %}
{% endfor %}
然而,循环每个类别的每个讲座都是低效的。根据您的型号,您应该可以执行以下操作:
{% for category in categories %}
<li><strong>{{ category.course_category }}</strong></li>
{% for lecture in category.lecture_set.all %}
<li>{{ lecture.lecture_title }}</li>
{% endfor %}
{% endfor %}
或者您可以循环阅读讲座,并使用{% ifchanged %}
标记来显示类别。
{% for lecture in lectures %}
{% ifchanged lecture.course_category %}
<li><strong>{{ lecture.course_category }}</strong></li>
{% endifchanged %}
<li>{{ lecture.lecture_title }}</li>
{% endfor %}