Mako模板继承错误 TypeError:'Undefined'对象不可调用
我有两个文件:
base_table.html 和 table_body.html
base_table.html
<%block name="bodytable">
<table cellspacing="0" cellpadding="0" border="1" width="100%">
<%block name="bodytabletbody">
<tbody>
<%block name="innerbodytabletbody">
<tr>
<%block name="bodytableth">
</%block>
</tr>
<%block name="bodytablebody">
</%block>
</%block>
</tbody>
</%block>
</table>
</%block>
表格的主体是从 base_table.html 继承过来的。
table_body.html
<%inherit file="base_table.html">
<%block name="bodytableth">
<td>
${_('User name')}
</td>
</%block>
<%block name="bodytablebody">
</%block>
</%inherit>
当我尝试渲染它的时候,出现了错误。
base_table_html in render_body(context, **pageargs)
base_table_html in render_bodytable(context, **pageargs)
base_table_html in render_bodytabletbody(context, **pageargs)
base_table_html in render_innerbodytabletbody(context, **pageargs)
table_body in render_bodytableth(context, **pageargs)
TypeError: 'Undefined' object is not callable
代码
# -*- coding: utf-8 -*-
import os
from mako.template import Template
from mako.lookup import TemplateLookup
from mako.runtime import Context
from cStringIO import StringIO
import tempfile
import subprocess
class MyTemplate(object):
'''Class to get the report template object.'''
def __init__(self):
self.lookup = TemplateLookup(directories=['.'])
def server_template(self, templatename):
return self.lookup.get_template(templatename)
def get_report(self, filename, data=None, rtype='txt'):
'''Get the output for the given report.'''
data = data or {}
t1 = self.server_template(filename)
buf = StringIO()
ctx = Context(buf, **data)
t1.render_context(ctx)
report_filename = os.path.join(
tempfile.gettempdir(),
'test.html'
)
report_file = open(report_filename, 'w')
report_file.write(buf.getvalue())
report_file.close()
if rtype == 'txt':
report_popen = subprocess.Popen(
[
'links',
report_filename,
'-dump',
'1'
],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
stdout, stderr = report_popen.communicate()
return stdout
if __name__ == '__main__':
a = MyTemplate()
print a.get_report('table_body.html')
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
1 个回答
2
看起来你在模板中没有传递任何数据。在你的代码中,你的基础模板里有...
<td>
${_('User name')}
</td>
中间那一行基本上是在说:“从数据中获取键为‘_
’的值,并用‘用户名称’作为参数调用它。” 但似乎你没有传递任何数据,模板会试图查找_
是什么,但显然找不到。结果就是它用一个叫“未定义”的特殊值来代替“_
”。
因为这个“未定义”的值无法被调用,所以就会出现错误。
要解决这个问题,你需要向模板传递数据,至少要有一个可以调用的对象来对应“_
”的值。例如..
def my_func(x):
return x
print a.get_report('table_body.html', data={'_' : my_func})