如何在Django模板中打破“for循环”

时间:2011-06-28 14:10:33

标签: django for-loop django-templates

我有这段代码

    {% for account in object_list %}
        <tr>
        {% for field, value in book.get_fields %}
              <th>{{ field.verbose_name }}</th> 
        {% endfor %}
        </tr>
    {{ break }}
    {% endfor %}

我想在第一次迭代后打破for循环。休息不起作用

8 个答案:

答案 0 :(得分:90)

我认为你应该使用切片来实现你的目标

{% for account in object_list|slice:":1" %}

答案 1 :(得分:16)

Django模板系统中没有break。 Django模板系统不是用 python 编程的,而是with its own language

根据您的需要,您可能会发现this question非常有用。否则,只需在RequestContext上的特殊字段上打上 HTML 上的唯一帐户

答案 2 :(得分:2)

您不能使用break语句,但您可以选择不在html上打印它们。它不是最佳解决方案,但您可以使用它。我使用以下一个;

{%for tumbnail in image %}
         {%if tumbnail.object_id == element.id %}
          <img src="/media/{{ tumbnail.image }}" class="tr_all_hover"alt="">

{{ "<!--" }}
  {%endif%} 
{%endfor%}     
{{ "-->" }}

它在浏览器上基本上看起来像这样。    http://i.stack.imgur.com/MPbR3.jpg

答案 3 :(得分:2)

     {% for i in list %}
      {% if forloop.counter < 11 %}                                     
        <tr>
          <td>{{ forloop.counter }}</td>
          <td>{{ i.product__name }}</td>
          <td>{{ i.brand__name }}</td>
          <td>{{ i.country__name}}</td> 
          <td>{{ i.city__name}}</td>  
                     
        </tr>
      {% endif %} 
             
      {% endfor %}

答案 4 :(得分:1)

我找到了一种方法来解决这个问题。这是丑陋和hacky,但它(适合我)。 first是OP想要的,但这更能回答实际问题。

鉴于此:

obj = {
  'children': [
    { 'possessions' : { 'toys': [] } },
    { 'possessions' : { 'toys': ['train'] } }
    { 'possessions' : { 'toys': ['train', 'ball'] } }
  ]
}

我想知道我的obj是否有任何孩子拥有玩具。

这就是我所做的:

Python等价物:

if ([child for child in obj.children if child.possessions.toys]):
  # Whatever

Django模板:

我的方法是使用regroup来构建符合或不符合标准的候选人:

{% regroup obj.children by possessions.toys|length_is:"0" as by_toys %}
{% for check in by_toys %}{% if check.grouper == False %}
  Whatever
{% endif %}{% endfor %}

regroup构建一个基本上是的新对象:

[
  { 'grouper': '', 'list': [/*...*/] },
  { 'grouper': True, 'list': [/*...*/] },
  { 'grouper': False, 'list': [/*...*/] }
]

length_is:"0"确保该列表中最多包含三个元素,grouperTrueFalse''。然后我们遍历列表并检查False值。

  • 如果没有孩子,则该列表为空,if永远不会被点击。
  • 如果没有孩子有玩具,那就是没有False grouper的列表。
  • 如果所有孩子都有玩具,那就是包含False grouper的列表。
  • 如果有些孩子有玩具,那就是包含FalseTrue grouper的列表。

答案 5 :(得分:1)

你可以使用你的Django模板系统循环javascript for循环作为内循环,并可以使用break如下: -

for(var i=0;i<1;i++){
        {% for owner in Owner %}
            id  = "{{owner.id}}";
            if(id == pk1){
                f="{{owner.flat}}";
                break;
            }             
        {% endfor %}
     }

答案 6 :(得分:1)

在这种情况下,您可以检查forloop.counter == 1或forloop.first并仅打印该第一项。

  {% for account in object_list %}
      {% if forloop.first %}
        <tr>
        {% for field, value in book.get_fields %}
              <th>{{ field.verbose_name }}</th> 
        {% endfor %}
        </tr>
      {% endif %}
    {% endfor %}

答案 7 :(得分:0)

Django 模板系统中没有 break,但您可以使用 bellow 架构实现类似 break 的语句。 (循环会进行迭代,但你什么都不做。)

1- 使用 with 定义一个变量来确定当前状态,

2- 使用模板自定义标记更改语句以否定当前状态。

在模板中这样使用:

{% with statement=1 %}
   {% for obj in listObject %}
       {% if ifStatement and statement %}
           {% changeStatement statement as statement %} // when u don't want to enter in if again.
           Do your job here!!
       {% endif %}
   {% endfor %}
{% endwith %}

在模板自定义标签中:

@register.simple_tag
def changeStatement(status):
    return not status