【问题标题】:How do I access Jinja2 for loop variables outside the loop?如何访问 Jinja2 以获取循环外的循环变量?
【发布时间】:2012-07-30 19:34:30
【问题描述】:

我有一个 Jinja2 模板页面,其中包含两个单独的 {% for %} 循环。如果这些循环都不包含任何项目,我希望页面重定向。

我正在尝试做这样的事情(伪代码):

loop1 = loop.length (in first loop)
loop2 = loop.length (in second loop)

if loop1 + loop2 == 0: redirect # (outside both loops)

这甚至可能吗?有没有办法让loop.length 变量在它们各自的循环之外可用?

【问题讨论】:

  • err.. 重定向需要来自服务器,与模板无关。
  • 尝试第一个循环 {% set i = loop.counter0 %} 第二个循环 {% set j = loop.counter0 %} 条件 {% if i+j equals 0 %}
  • 这是我首先尝试的,但是 i 和 j 不存在于它们各自的循环之外。
  • 每个循环每次迭代时都会在页面上放置一个 div,这些 div 共享一个在其他地方找不到的类、文本等。有没有办法在两个循环都运行后简单地说,“如果页面上不存在此类或文本,则重定向”?

标签: python jinja2


【解决方案1】:

你可以检查你的列表是否真实,在 Jinja2 中空列表是错误的。

{% if things %}
    {% for thing in things %} .... {% endfor %}
{% else %}
    <!-- redirect here -->
{% endif %}

【讨论】:

  • 这里的问题是我正在过滤 for 条件,所以它实际上是 {% for thing in things if not thing.attribute %} 那么我如何测试“things if not thing.attribute “是真的吗?
【解决方案2】:

简单的答案是“不”:您不能使用模板重定向——它应该在控制器/服务器的视图逻辑中。

虽然技术上可以,但对任何人都没有好处。

【讨论】:

  • 我意识到,但在这种情况下我别无选择,项目(希望)不会需要这个很长时间,并且决定这样做比改变事情更容易在后端。
  • 那么你只是在中间代理重定向规则——虽然听起来很糟糕
  • @DsDyer:那么你应该问问那些认为编写代码很容易的人,并反驳所有声称这实际上并不容易的人。
【解决方案3】:

假设这两个东西都是列表,你可以这样做:

{% set all_things = thing1 + thing2 %}
{% if all_things %}
    {# There is more than one thing in the two lists #}
{% else %}
    {# redirect #}

话虽如此,这不是属于模板级别的东西 - 您每次点击页面时都会生成另一个列表,其中包含 thing1thing2 中的所有内容,这将花费资源。您将应用程序逻辑放在模板级别,这是不可维护的。最后,您正在解决更大的问题——更改后端代码的成本很高。 (请理解,在所有这些情况下,“您”都是通用的“您”——就像在“您工作的公司”中一样)。

您(特别是)应该向那些要​​求您实施此 hack 的人提出这些问题,并尝试在此工具/产品/公司成为 FrankenCode 之前改变其所采取的方向。

祝你好运!

【讨论】:

    【解决方案4】:

    您可以使用length filter 来检查things 对象(您正在循环的对象)的长度:

    {{things|length}}
    

    现在回答你的问题。假设您循环的对象名为t1t2,您可以这样做:

    {% if t1 | length == 0 and t2 | length == 0 %}
     //use javascript to redirect(assuming you have the link)
    {% endif %}
    

    您可以在 JavaScript 块中执行此操作。我不知道这是否是最有效的方法,但是,它应该可以工作。

    我发布这个答案,因为这个问题没有投票或接受的答案。
    我确实希望这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-08
      • 1970-01-01
      • 2017-03-13
      • 1970-01-01
      • 2012-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多