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

Posted

技术标签:

【中文标题】如何打破 Django 模板中的“for循环”【英文标题】:How to break "for loop" in Django template 【发布时间】: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 循环。休息不工作

【问题讨论】:

如果要在第一次迭代后停止,为什么要使用循环?使用% with account=object_list|first % ... % endwith % 另见***.com/questions/10397470/… 【参考方案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">

 "<!--" 
  %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?

【讨论】:

以上是关于如何打破 Django 模板中的“for循环”的主要内容,如果未能解决你的问题,请参考以下文章

如何从 django 模板中的 for 循环中获取特定的 id?

Django模板中的for循环

如何在 Django 2.1 中的模板内的 for 循环内设置变量?

Django模板中的数字for循环

如何在 django 模板中从 for 循环中转义一行

液体模板:for循环中的偶数/奇数项目