在文章索引中,我想显示给定文章的第一张照片。照片在另一个模型中,该模型具有用于模拟文章的外键。
所以我从应该显示的给定类别中选择文章,然后我从给定类别中选择所有照片并在模板中匹配它们的slug然后我(想)只显示第一个结果。
但是我用于此目的的forloop.counter没有按预期工作。它在通过endfor标记时继续而不重置。
例如代替:“1,2,3,endfor,1,2,3,4,5,endfor,1,2,3,4”它的数量为:“1,2,3,endfor,4 ,5,6,7,8-,ENDFOR,9,10,11,12"
我错过了什么吗?
这是模板代码:
{% extends 'index.html' %}
{% load markup %}
{% load thumbnail %}
{% block content %}
{% for itm in plays %}
<h2>{{ itm.name }}</h2>
<div>{{ itm.desc }}</div>
<div>
{% for ftk in photos %}
{% if ftk.nameofplay.slug == itm.slug %}
{% if forloop.counter == 1 %}
{% thumbnail ftk.photo "100x100" crop="center" as im %}
<img src="{{ im.url }}" width="{{ im.width }}" height="{{ im.height }}">
{% endthumbnail %}
{% endif %}
{% endif %}
{% endfor %} {# forloop.counter should reset here and start from 1 again. or not? #}
</div>
<div>{{ itm.text|markdown|truncatewords_html:25 }}</div>
{% endfor %}
{% endblock %}
并从views.py发送一些这样的内容:
plays = Plays.objects.filter(category__slug__exact = category)
photos = Photos.objects.filter(nameofplay__category__slug__exact = category)
谢谢!
答案 0 :(得分:1)
一旦循环遍历所有照片,照片循环将从播放查询集中的下一个实例重新开始,但似乎可能有更快的方法来完成此操作。
由于Photo模型通过ForeignKey连接到Article模型,并假设照片连接到正确的文章,您应该能够在模板中执行类似的操作,这样可以避免每个照片都要检查文章:
plays = Plays.objects.filter(category__slug__exact = category)
{% for itm in plays%}
{% itm.photo_set.all.0 %}
{% endfor %}
有关更多详细信息,请参阅相关对象参考文档: https://docs.djangoproject.com/en/dev/ref/models/relations/
答案 1 :(得分:0)
通过“额外”方法在视图方法中准备文章及其第一张照片的数据。 https://docs.djangoproject.com/en/dev/ref/models/querysets/#django.db.models.query.QuerySet.extra
plays = Plays.objects.filter(category__slug__exact=kategorie).extra(
select={
'first_photo': 'Put this your select query for getting first photo (i.e. photo url)'
},
params={'category': your_param})
在模板中,您可以获得第一张照片:
{% for item in plays %}
{{ item.first_photo }}
{% endfor %}