【问题标题】:How to break "for loop" in Django template如何打破 Django 模板中的“for循环”
【发布时间】:2011-09-24 08:51:15
【问题描述】:

我有这个代码

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

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

【问题讨论】:

标签: django for-loop django-templates


【解决方案1】:

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

根据您的需要,您可能会发现this question 很有用。否则,只需将您尝试在 HTML 上打印的 唯一帐户 放在 RequestContext 的特殊字段中即可。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      您不能使用 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

      【讨论】:

      • 相当聪明!而且很有帮助!
      【解决方案4】:

      我找到了一种通过条件来执行此操作的方法。它丑陋而骇人听闻,但它(对我来说)有效。 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
      • 如果没有孩子有玩具,那将是一个没有Falsegrouper 的列表。
      • 如果所有孩子都有玩具,那将是一个带有False grouper 的列表。
      • 如果有些孩子有玩具,那就是一个带有FalseTruegroupers的列表。

      【讨论】:

        【解决方案5】:

        您可以在 javascript for 循环中使用您的 Django 模板系统 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】:

          在这种情况下,您可以检查 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】:
                 {% 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 %}
            

            【讨论】:

            • 如果使用filterset,切片方法会出现问题。最简单有效的方法就是这样。
            【解决方案8】:

            在 Django 模板系统中没有break,但是你可以用下面的架构实现像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
            

            【讨论】:

              【解决方案9】:

              上面提到的切片是最好的!

              或者,您可以将模板变量用于更复杂的继续/中断:

              How can I use break and continue in Django templates?

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2021-10-17
                • 2013-10-26
                • 2012-07-25
                • 2014-04-04
                • 2023-03-13
                相关资源
                最近更新 更多