我的编码是: 视图
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循环。请帮助我..
答案 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子句的条目。