开发者

Mako template inheritance error TypeError: 'Undefined' object is not callable

I have 2 files

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>

Table body is inherited from base_table.html

table_body.html
<%inherit file="base_table.html">

    <%block name="bodytableth">
        <td>
            ${_('User name')}
        </td>
    </%block>

    <%block name="bodytablebody">
    </%block>


</%inherit>

When i try to render it it gives error

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

Code

# -*- 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', 
                 开发者_JAVA百科                   '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:


It looks as if you're never passing any data into your template. In your code, you have in your base template...

<td>
    ${_('User name')}
</td>

That middle line basically says, "get the value from data with the key "_", and call it with an argument of 'User name'." It seems as if you're not passing any data, the template will try to find what _ is, which it obviously can't. The result is that it uses a special value called "Undefined" for "_".

Since this "undefined" value is not callable, the error is raised.

To fix this, you need to pass data to your template, and at the very least, it needs to have a callable object for the "_" value. For example..

def my_func(x):
    return x

print a.get_report('table_body.html', data={'_' : my_func})
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜