如何在Django模板中1次迭代后打破“for循环”

xyhw6mcr  于 2023-05-01  发布在  Go
关注(0)|答案(9)|浏览(328)

我有这个密码

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

我想在第一次迭代后中断for循环。中断不起作用

31moq8wy

31moq8wy1#

我认为你应该用slice来达到你的目的

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

chhkpiq42#

Django模板系统中没有break。Django模板系统不是用python编写的,而是用with its own language编写的。
根据您需要做的事情,您可能会发现this question很有用。否则,只需将您尝试在HTML上打印的唯一账户放在RequestContext的特殊字段中即可。

ej83mcc0

ej83mcc03#

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

o2rvlv0m

o2rvlv0m4#

{% 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 %}
anhgbhbe

anhgbhbe5#

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

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

oiopk7p56#

我找到了一个有条件的方法。这是丑陋和黑客,但它的工作(对我来说)。first是OP想要的,但这更接近地回答了实际问题。
鉴于此:

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

我想知道我的对象是否有任何孩子的财产是玩具。

我做了什么:

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的列表。
  • 如果所有的孩子都有玩具,那么它将是一个Falsegrouper的列表。
  • 如果一些孩子有玩具,它将是一个FalseTruegrouper s的列表。
vyu0f0g1

vyu0f0g17#

在这种情况下,你可以检查是否forloop。counter == 1或if forloop。首先,简单地打印第一项。

{% 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 %}
jucafojl

jucafojl8#

Django模板系统中没有break,但是你可以用下面的架构来实现像break这样的语句。(循环将进行迭代,但你什么也不做。)
1-与一起使用定义变量以确定当前状态,
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
6jjcrrmo

6jjcrrmo9#

切片是上面提到的最好的!
或者,您可以使用模板变量来处理更复杂的continue/break:
如何在Django模板中使用break和continue?

相关问题