pylons mako如何检查变量是否存在

时间:2012-08-17 13:25:22

标签: pylons mako

在django,我们可以这样做:

views.py : 

    def A(request):
        context = {test : 'test'}
        return render_to_response('index.html', context , context_instance = RequestContext(request))

    def B(request):
        context = {}
        return render_to_response('index.html', context , context_instance = RequestContext(request))

index.html:

        {% if test %}
            {{ test }}
        {% endif %}

让我们的模板呈现没有错误,即使我使用method B,其中变量'test'不存在,但我仍然可以将其放在模板中。

我想在控制器中用pylons + mako做同样的事情:

foo.py

    def A(self):
        c.test = 'test'
        return render('index.html')

    def B(self):
        return render('index.html')

index.html :

        % if c.test:
            ${'c.test'}
        % endif

在Django中,我可以做到这一点,但在Pylons中,我收到一个错误,无论如何检查'c.test'是否存在?

错误:AttributeError:'ContextObj'对象没有属性'test'

3 个答案:

答案 0 :(得分:7)

我有一个类似的问题,我有多个视图使用相同的模板,需要测试是否设置了变量。我查看了引用的文档,并发现了解决此问题的另一种方法,无论mako.strict_undefined如何设置。基本上,您在get()对象上调用context方法。在您的示例中,您可以执行以下操作:

% if context.get('test', UNDEFINED) is not UNDEFINED:
  ${test}
% endif

${context.get('test', '')}

如果存在,则打印与${test}相同,如果不存在则打印空字符串。

很遗憾,您似乎无法在in上使用最context的{​​{1}}运算符。

答案 1 :(得分:5)

来自mako Docs on Context Variables

% if someval is UNDEFINED:
    someval is: no value
% else:
    someval is: ${someval}
% endif

文档将此描述为引用不在当前上下文中的变量名称。 Mako会将这些变量设置为值UNDEFINED

我检查变量如下:

% if not someval is UNDEFINED:
    (safe to use someval)

但是,如果pylons / pyramid设置为strict_undefined=True,则尝试使用未定义变量会导致NameError被引发。他们用这种方式给出了一个简短的哲学理由,而不是简单地用空字符串替换未设置的变量,这似乎与Python哲学一致。花了一些时间才发现这一点,但阅读整个section on the Mako Runtime将清除Mako如何接收,设置和使用上下文变量。

修改
为了完成,文档解释了strict_undefined设置here。您可以通过在其中一个.ini文件中设置来更改此变量:

[app:main]
...
mako.strict_undefined = false

答案 2 :(得分:0)

有点晚了,所以每当你在模板上使用控制器上不存在的变量时,pylons就会引发错误,要禁用错误,只需将它放在你的environment.py中:

config['pylons.strict_tmpl_context'] = False