如何打破 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"
确保我们在该列表中最多包含三个元素,并且grouper
是True
或False
或''
。然后我们遍历列表并检查 False
值。
if
。
如果没有孩子有玩具,那将是一个没有False
grouper
的列表。
如果所有孩子都有玩具,那将是一个带有False
grouper
的列表。
如果有些孩子有玩具,那就是一个带有False
和True
grouper
s的列表。
【讨论】:
【参考方案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?