It will probably not comfort you that the concept of a "view" (at least by that name) is going to disappear sometime post-3.2.

I hope I explain this properly; here goes.

A view is a registration for a "named multiadapter". The thing that is registered ("the view") adapts two objects that implement interfaces to a different interface. Part of what makes a "view" a "view" is that it's registered to accept two objects in its factory: a content object and a request object. Another kind of "named multiadapter" might accept three, four, or five objects in its factory. A view happens to accept two, and only by convention are these two objects that are "context" and "request" objects.

When you look up a "view", the two objects you pass to "getView" (context and request) conventionally implement, respectively, IBrowserRequest and a content class interface. There is a class registered to adapt them to a marker interface (zope.Interface). So when a view is looked up like this:

from zapi import getView
from zope.interface import Interface
from zope.interface import implements
from zope.publisher.interfaces.browser import IBrowserRequest

class IContent(Interface):
class Content(object):
content = Content()
class Request(object):
request = Request()

getView(content, u'index.html', request)

... under the hood the lookup is translated to:

getMultiAdapter((content, request), Interface, name=u'index.html')

... and you get back a view class instance. The view class constructor is passed "content" and "request" in its constructor because that's what getMultiAdapter is wired to do. If you were adapting more than two, the class constructor would be passed three, or four, etc.

This is because the registration of a view class (when it happens via ZCML) is essentially:

from zope.component import registerAdapter

class SomeView(object):
    def __init__(self, context, request):
        self.context = context
        self.request = requests

registerAdapter(SomeView, (IContent, IBrowserRequest), Interface, name=u'index.html')

The concept of a "view" is purely convention. getView is actually deprecated in the trunk at least, as a result. I don't know if that makes anything clearer but I for one welcome our new simplification overlords.

On Jan 1, 2006, at 12:20 PM, Wade Leftwich wrote:

Since Zope 3 is all about being self-documenting and discoverable, it
seems odd that something as central as a View has the "implicit"
attributes 'context' and 'request'. Is there an architectural reason
that we don't say that a View class implements an IView interface that
gives the names of the expected attributes?

If this question is hopelessly naive, please be gentle.

-- Wade Leftwich
Ithaca, NY

Zope3-users mailing list

Zope3-users mailing list

Reply via email to