6

在 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, where 变量'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'

4

3 回答 3

9

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

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

或者

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

这将像存在一样打印,${test}如果不存在则打印一个空字符串。

不幸的是,您似乎无法使用最直观的in运算符。context

于 2013-07-09T17:47:52.923 回答
8

来自mako Docs on Context Variables

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

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

我检查像这样的变量:

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

但是,如果 pylons/pyramid 具有strict_undefined=True设置,则尝试使用未定义的变量会导致NameError引发 a。他们为这样做提供了一个简短的哲学理由,而不是简单地用空字符串替换未设置的变量,这似乎与 Python 哲学一致。我花了一段时间才找到这个,但阅读Mako 运行时的整个部分将清楚 Mako 如何接收、设置和使用上下文变量。

编辑
为完成起见,文档解释了此处strict_undefined的设置。您可以通过在您的 .ini 文件之一中设置它来更改此变量:

[app:main]
...
mako.strict_undefined = false
于 2012-08-17T13:32:28.423 回答
0

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

config['pylons.strict_tmpl_context'] = False
于 2012-08-18T08:32:46.983 回答