[Zope3-dev] views have no __page_attribute__ ?
Jim Fulton
jim at zope.com
Tue Oct 4 13:06:19 EDT 2005
Jean-Marc Orliaguet wrote:
> Hi!
>
> I've encountered a problem when trying to render views (there is no
> problem with rendering pages), but for instance with the '+' view that
> is defined in app/container/browser/configure.zcml
>
> <view
> for="zope.app.container.interfaces.IContentContainer"
> name="+"
> menu="zmi_actions" title="Add"
> class="zope.app.container.browser.adding.ContentAdding"
> permission="zope.ManageContent"
> allowed_attributes="addingInfo isSingleMenuItem hasCustomAddView">
>
> <page name="index.html" template="add.pt" />
> <page name="action.html" attribute="action" />
>
> </view>
>
>
> when called with:
>
> markup = view()
>
> ['view' being the 'view' variable gotten from ZPT)
>
> results in the following error message:
>
> ...
> markup = view()
> File "/home/jmo/Zope3/src/zope/app/publisher/browser/viewmeta.py",
> line 445, in __call__
> attr = self.__page_attribute__
> AttributeError: '+' object has no attribute '__page_attribute__'
>
> because the __call__ method of
> zope.app.publisher.browser.viewmeta.simple expects views and pages to
> have a page attribute:
>
> def __call__(self, *a, **k):
> # If a class doesn't provide it's own call, then get the attribute
> # given by the browser default.
>
> attr = self.__page_attribute__
>
>
> With the '+' view described above, there is a default page attribute to
> use for displaying the view ('index.html') and but no page attribute
> explicitly assigned.
>
> The following patch fixes the problem, but I'm afraid that I'm missing
> something: are views supposed to have a '__page_attribute__' or not?
They are only supposed to ave a page attribute if they are pages. :)
The directive above creates a view *with pages*. This means that the
view itself should not a page and is not intended to be callable.
Bottom line: views created this way are not callable and are not directly
renderable.
There's a bit more complexity than I'd like in these view directives. This is
why, more and more, I tend to *define* views in Python and just register them
with the adapter or view directive. I still do often find it useful to register
views with the view directive, mainly so I can avoid having to mention IBrowserRequest.
Jim
--
Jim Fulton mailto:jim at zope.com Python Powered!
CTO (540) 361-1714 http://www.python.org
Zope Corporation http://www.zope.com http://www.zope.org
More information about the Zope3-dev
mailing list