[Zope3-dev] views have no __page_attribute__ ?

Jean-Marc Orliaguet jmo at ita.chalmers.se
Tue Oct 4 16:13:17 EDT 2005


Jim Fulton wrote:

> Jean-Marc Orliaguet wrote:
>
>> Jim Fulton wrote:
>>
>>
>>> Jean-Marc Orliaguet wrote:
>>>
>>>
>>>> ...
>>>>
>>>> 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
>>>
>>
>>
>> OK, so the 'view' object set in page templates is not the object to call
>> for rendering the page.
>
>
> Uh, normally the page template renders the page.
>
> Different views are constructed differently.  Views created
> with the page directive and views created with a view directive
> without page subdirectives *can* be called to render pages --
> basically because they *are* pages.  OTOH a view directive with
> page subdirectives is meant to be traversed to get to it's pages,
> which then can be called.
>
>> All in all, I managed to render the '+' view by calling the 'template'
>> object and passing the 'view' as the instance parameter
>>
>>
>>>>> markup = template(instance=view)
>>>>
>
> I'm confused. Aren't you already in the template?
>
> Jim
>
>

well sort of: I do start from a standard template (the original
browser/skin/template.pt) that contains the macro -page definition, the
<head> markup, and the actual call to the theme renderer in the <body>
part of the template.

<metal:block define-macro="page">
<metal:block define-slot="doctype">
<html>
<head>CSS / JS comes here</head>
<body tal:content=""python: theme.render(...)" />
</html>

 then I pass the:
- context
- view
- template

 to theme.render(...)

then the renderer in python takes care of rendering for the main content
area that would have been displayed otherwise. So I have to "re-render"
the page in its original context.

It works apparently with:

 template(instance=view) ..

/JM



More information about the Zope3-dev mailing list