[Zope] NamedTemplate.__call__ not returning anything

Maurits van Rees m.van.rees at zestsoftware.nl
Sun Jan 13 18:32:42 EST 2008


Hi,

I have some code where I try to get a named template and render it and
if it fails I render a default template instead.  But this fails,
presumably because the __call__ method of NamedTemplate does not
return anything.  From zope/formlib/namedtemplate.py (Zope 2.10):

class NamedTemplate(object):

    def __init__(self, name):
        self.__name__ = name

    def __get__(self, instance, type=None):
        if instance is None:
            return self
        return component.getAdapter(instance, INamedTemplate, self.__name__)

    def __call__(self, instance, *args, **kw):
        self.__get__(instance)(*args, **kw)

I seems strange to me that __call__ does not actually return
anything.  Is it just me?

Now, I have some other code where NamedTemplate is working just fine,
so there is probably nothing wrong with this __call__ method.  So can
anybody tell me what is wrong with my following code then?

class Renderer(base.Renderer):
    default_template = ViewPageTemplateFile('vocabularyportlet.pt')

    def render(self):
        """Render a named template or the default template.
        """
        template = NamedTemplate("test.vocabulary")
        try:
            output = template(self)
        except ComponentLookupError:
            output = None
        # Even if the component lookup works, output can be None.
        if output is None:
            output = self.default_template()
        return output

The line "output = template(self)" fails with a ComponentLookupError
unless a named template with the name test.vocabulary exists.  But
when that template is found, output is still None.

In case you want to see the entire code, this is in a Plone portlet
that I am developing:
http://svn.plone.org/svn/collective/collective.portlet.vocabulary/trunk/collective/portlet/vocabulary 

And actually, the tests that I added pass when I change the
NamedTemplate.__call__ method to return the value that it just got.

So should that method be changed or is there a different way to do this?

Thanks,

-- 
Maurits van Rees | http://maurits.vanrees.org/
            Work | http://zestsoftware.nl/
"This is your day, don't let them take it away." [Barlow Girl]



More information about the Zope mailing list