forloop.counter在我的django模板中没有按预期重置

时间:2012-02-07 04:28:35

标签: django templates loops for-loop

在文章索引中,我想显示给定文章的第一张照片。照片在另一个模型中,该模型具有用于模拟文章的外键。

所以我从应该显示的给定类别中选择文章,然后我从给定类别中选择所有照片并在模板中匹配它们的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)

谢谢!

2 个答案:

答案 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 %}