在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 %}
Run Code Online (Sandbox Code Playgroud)
让我们的模板渲染没有错误,即使我使用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
Run Code Online (Sandbox Code Playgroud)
在Django中,我可以做到这一点,但在Pylons中,我收到一个错误,无论如何检查是否'c.test'
存在?
错误:AttributeError:'ContextObj'对象没有属性'test'
% if someval is UNDEFINED:
someval is: no value
% else:
someval is: ${someval}
% endif
Run Code Online (Sandbox Code Playgroud)
文档将此描述为引用不在当前上下文中的变量名称.Mako会将这些变量设置为该值UNDEFINED
.
我检查变量是这样的:
% if not someval is UNDEFINED:
(safe to use someval)
Run Code Online (Sandbox Code Playgroud)
但是,如果pylons/pyramid有strict_undefined=True
设置,尝试使用undefined变量会导致NameError
被引发.他们用这种方式给出了一个简短的哲学理由,而不是简单地用空字符串替换未设置的变量,这似乎与Python哲学一致.花了一些时间来找到这个,但是阅读Mako Runtime上的整个部分将清楚Mako如何接收,设置和使用上下文变量.
编辑:
为完成起见,文档解释了此处的strict_undefined
设置.您可以通过在其中一个.ini文件中设置此变量来更改此变量:
[app:main]
...
mako.strict_undefined = false
Run Code Online (Sandbox Code Playgroud)
我有一个类似的问题,我有多个视图使用相同的模板,需要测试是否设置了变量.我查看了引用的文档,并找到了解决此问题的另一种方法,无论如何mako.strict_undefined
设置.基本上你get()
在context
对象上调用方法.在您的示例中,您可以执行以下操作:
% if context.get('test', UNDEFINED) is not UNDEFINED:
${test}
% endif
Run Code Online (Sandbox Code Playgroud)
要么
${context.get('test', '')}
Run Code Online (Sandbox Code Playgroud)
这将打印相同,${test}
如果它存在,打印空字符串,如果它不存在.
不幸的是,您似乎无法使用最直观的in
运算符context
.
归档时间: |
|
查看次数: |
5316 次 |
最近记录: |