2012-07-30 146 views
0

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

我试图做这样的事情(伪代码):

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

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

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

+0

错误..重定向需要来自服务器,与模板无关。 – 2012-07-30 19:46:02

+0

try * first loop *'{%set i = loop.counter0%}'* second loop *'{%set j = loop.counter0%}'* condition *'{%if i + j等于0%}' – 2012-07-30 19:46:25

+0

这是我第一次尝试,但我和j不存在于各自的循环之外。 – DsDyer 2012-07-30 21:01:01

回答

0

您可以检查您的名单真相,在Jinja2空列表是错误的。

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

这里的问题是,我过滤的条件,所以它实际上是 {%的东西的事情,如果没有thing.attribute%} 那我怎么当“的事情,如果不thing.attribute”测试真正? – DsDyer 2012-07-30 22:21:11

0

简单的答案是“不”:使用模板,您不能再直接 - 它应该是在控制器/服务器的视图逻辑。

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

+0

我意识到这一点,但在这种情况下我没有选择,该项目(希望)不会需要这么长时间,并且决定这样做会比在后端改变事情更容易。 – DsDyer 2012-07-30 20:11:00

+0

然后你只是在中间代理重新指定规则 - 听起来像一个可怕的方式来做到这一点虽然 – 2012-07-30 20:17:49

+0

@DsDyer:那么你应该问那个决定写代码很容易的人,并反驳所有声称它是其实并不容易。 – geoffspear 2012-07-30 21:27:46

0

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

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

话虽这么说,这是的东西,属于在模板级别 - 要生成一个包含所有的东西在另一个列表每次你点击页面时都会出现thing1thing2,这会耗费资源。您正在将应用程序逻辑放在模板级别,这将不可维护。最后,您正在讨论更大的问题 - 对后端代码进行更改是很昂贵的。 (请理解,在所有这些情况下,“你”是通用的“你” - 就像“你工作的公司”一样)。

您(具体而言)应该向那些要​​求您实施这种攻击并尝试改变此工具/产品/公司在成为FrankenCode之前所采取的方向的人提出这些问题。

祝你好运!

0

你可以通过使用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块做到这一点。我不知道这是否是最有效的方法,但它应该起作用。

我发布了这个答案,因为这个问题没有增加投票或接受的答案。
我希望这有助于。