我该如何在Django模板中使用break和continue?

29

我希望在我的代码中使用break和continue,但是在Django模板中无法正常工作。如何在Django模板的循环中使用continue和break?以下是一个示例:

{% for i in i_range %}
{% for frequency in patient_meds.frequency %}
{% ifequal frequency i %}
<td class="nopad"><input type="checkbox" name="frequency-1" value="{{ i }}" checked/> {{ i }} AM</td>
{{ forloop.parentloop|continue }} ////// It doesn't work
{ continue }                      ////// It also doesn't work
{% endifequal %}
{% endfor%}
<td class="nopad"><input type="checkbox" name="frequency-1" value="{{ i }}"/> {{ i }} AM</td>
{% endfor %}

你需要更清楚明白。这是一个Python问题还是Django模板问题?通常模板中不应该有这样的逻辑。你能否发布一些带有代码的简单示例? - Spacedman
2
你需要展示出有问题的代码,并解释它的失败原因(例如,将精确的错误信息复制到你的问题中)。 - Sven Marnach
% for i in i_range %} {% for frequency in patient_meds.frequency %} {% ifequal frequency i %} {{ i }} 上午 {{ forloop.parentloop|continue }} ////// 它不起作用 { continue } ////// 它还是不起作用 {% endifequal %} {% endfor%} {{ i }} 上午 {% endfor %} - GoldenBird
4个回答

39

1
这比我预期的实现 continue 和 break 需要更多的代码。 - Mr. Lance E Sloan

37
在Django模板中,for循环与纯Python的for循环不同,因此其中不支持continue和break语句。请参阅Django docs,您会发现没有break或continue模板标签。考虑到在Django模板语法中保持简单明了的总体位置,您可能需要找到其他方法来完成您所需的操作。

4
没错,但这更像是限制而不是“保持简单原则”。使用break很简单。 例如:如果任何嵌套循环生成了足够的项目,则停止迭代主循环- 在模板中使用break非常有用且简单- 像Mako或Cheetah这样的整洁模板系统支持break / continue。 - Sławomir Lenart
在你提供的例子中,你可以简单地使用模板标签 slice(例如:list|slice:":10")来限制循环到一定数量的迭代,甚至可以在上下文级别完成。 - gdvalderrama

16

大多数情况下不需要自定义模板标签,很容易实现:

继续

{% for each in iterable %}
  {% if conditions_for_continue %}
       <!-- continue -->
  {% else %}
       ... code ..
  {% endif %}
{% endfor %}

break使用相同的思路,但具有更广泛的范围:

{% set stop_loop="" %}
{% for each in iterable %}
  {% if stop_loop %}{% else %}
       ... code ..
       under some condition {% set stop_loop="true" %}
       ... code ..
  {% endif %}
{% endfor %}

这是Jinja模板,你可以在Django中轻松使用,因为Jinja已经内置。

你甚至可以在同一个项目中使用两个模板后端(Jinja和Django模板)。


3
这是Jinja模板。 - HenryM
Django模板中没有set命令。 - parmer_110

2
如果您想在特定条件后使用continue/break,我使用以下简单标签来实现,在"Vanilla" Django 3.2.5中使用如下:
@register.simple_tag
def define(val=None):
  return val

然后您可以在模板中将其视为任何变量使用

{% define True as continue %}
      
{% for u in queryset  %}

  {% if continue %}

    {% if u.status.description == 'Passed' %}
      <td>Passed</td>
      
      {% define False as continue %}

    {% endif %}

  {% endif %}

{% endfor %}

非常适用于任何想要在模板中重复使用变量而不使用 with 语句的类型。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接