2012-04-13 162 views
14

这种处理未定义的模板变量是龙卷风模板(比如,在文件logout.html)我呈现在注销过程中出现错误:使用在龙卷风

{% if logout_error %} 
    Oops! The logout failed. Please close all open documents and try again 
    {% end %} 

这可以被称为

self.render("logout.html", logout_error=True) 

如果退出是成功的,我所要做的

self.render("logout.html", logout_error=False) 

如果我不理logout_error=False,我得到

NameError: global name 'logout_error' is not defined 

如果有很多标志(这是错误的),关键字参数可能会堆积。如果不存在,是否有方法可以让模板将logout_error视为False

回答

16

使用locals().get()进行黑客入侵是实现此目的的一种方法。另一点,更正统的是使用try。龙卷风模板支持,所以您可以:

{% try %} 
    {% if logout_error %} 
    Oops! The logout failed. Please close all open documents and try again 
    {% end %} 
{% except %} 
{% end %} 
+1

vartec,谢谢你的回答。我打算将phihag的答案标记为正确(尽管你的问题很好),因为它的简洁 – 2012-04-14 11:26:44

+1

这对我来说似乎是更好的解决方案,特别是在阅读关于locals()http:// stackoverflow的这个半警告故事之后。 COM /问题/ 1550479/Python的 - 是 - 使用 - 瓦尔本地人,一个好的做法。 (Django模板默认默认失败,不是吗?) – jsh 2013-02-21 22:41:29

+1

由于某种原因,我从来没有'locals()。get()'工作。你的解决方案虽然工作正常谢谢! +1 – Micke 2013-09-28 09:07:38

14

您可以使用

{% if locals().get('logout_error', False) %} 

替换False你想要的,如果没有设置该属性值。

+2

作为@shenyan分列如下,在某些情况下(对我来说,如果你在传递变量用'render'模板)的变量'globals'结束了,不'locals'。我不确定是否可以依靠此行为安全 - 稍微讨论一下:https://groups.google.com/forum/#!topic/python-tornado/MppS69GjZk0。 try/catch的答案很难看,但更具弹性。 – tobek 2015-02-20 20:12:22

0

“龙卷风方式”是没有未申报的变量。更明确地声明变量。

解决方法:

{% if 'grok' in globals() %} 
    {{grok}} 
{% end %} 

{% if globals().get('grok_error', False) %} 
    error message 
{% end %}