在django中进行循环迭代

时间:2012-05-01 12:10:59

标签: django django-templates

我的编码是: 视图

def showThread(request, thread_id)
    post_list     = Post.objects.filter(id = thread_id)
    post_likes    = PostLikes.objects.all()
    return render_to_response('show.html',locals(),context_instance=RequestContext(request))

模型:

class Post(models.Model):
        subject = models.CharField(max_length = 250)
        body = models.TextField()
        thread = models.ForeignKey('self', null = True, editable = False )

Show.html:

{% for post in post_list %}
   {{post.id}}{{post.subject}}
{% endfor %}
{% for post_like in post_likes %}
   {% if post_like.post_id == post.id and post_like.user_id == user.id %} 
         U like this post{{post}}
   {% else %}
         {{post}}
   {% endif %}      
{% endfor %} 

在show.html,else部分中,它会一次又一次地显示值。但我只需要一次。当我进入其他条件时,我怎么能打破for循环。请帮助我..

4 个答案:

答案 0 :(得分:5)

Django的for标签没有为您提供任何突破循环的方法。您只需在自己的视图中过滤集合,并在条件失败后将其切片并将其提供给模板。

答案 1 :(得分:2)

您可以使用此django snippets page中的django自定义模板标记。如果您对使用它有疑问,请转到this page了解自定义模板标记。

然后使用{% load loop_break %}在模板中加载模板标记。然后你可以打破下面给出的for循环:

{% for post_like in post_likes %}
    {% if post_like.post_id == post.id and post_like.user_id == user.id %} 
        U like this post{{post}}
    {% else %}
        {{post}}
        {{ forloop|break }}
    {% endif %}
{% endfor %}

这里for循环会在进入 else 部分时中断。

答案 2 :(得分:1)

你可以使用ifchanged标签:
https://docs.djangoproject.com/en/dev/ref/templates/builtins/?from=olddocs#ifchanged

但是,您可能应考虑将此逻辑移至视图中。

答案 3 :(得分:1)

如果您可以构造if语句以检测何时不输出任何内容,则可以在else子句中放置任何内容:

{% for post_like in post_likes %}
   {% if post_like.post_id == post.id and post_like.user_id == user.id %} 
         U like this post{{post}}
   {% else %}
         {% if forloop.first %}
             {{post}}
         {%else%}{%endif%}
   {% endif %}      
{% endfor %} 

以上可能不会做你想要的 - 你必须自己调整它。你不能做的唯一事情是设置一个标志,这是第一个进入else子句的条目。