Пользовательские представления для ATDocuments, созданные с помощью GenericSetup

У меня есть папочный класс ATDocument, созданный с помощью универсальной настройки, в файле конфигурации XML общей настройки определены следующие переменные представления:

<property name="immediate_view">TemplateFileName</property>
<property name="default_view">TemplateFileName_view</property>
<property name="view_methods">
    <element value="TemplateFileName_view"/>
</property>

Можно ли заменить это представление диспетчером, то есть классом BrowserView, который при __call__ будет отправлять фактический экземпляр ViewPagetTemplateFile()?

Я попытался заменить имя файла шаблона именем метода этого класса, но это, похоже, не работает. Также я проследил за деревом наследования ATDocument от ATCTContent до BaseContent, но я не нашел никаких определений представлений, поэтому я предполагаю, что представления обрабатываются с помощью одного из унаследованных дополнений.


person Alex Volkov    schedule 05.06.2012    source источник


Ответы (1)


Имена в XML-файле GenericSetup являются либо именами представлений, либо элементами оформления; имена представлений ищутся с использованием тех же механизмов обхода, что и при непосредственном указании представления в URL-адресе.

Таким образом, в качестве метода просмотра можно использовать все, к которым можно получить доступ по URL-адресу. Сюда входят представления, которые отправляются другим представлениям в методе __call__:

from zope.publisher.browser import BrowserView
from zope.component import getMultiAdapter

class DispatchingView(BrowserView):
    def __call__(self):
        if somecondition:
            newviewname = 'foo'
        else:
            newviewname = 'bar'

        return getMultiAdapter((self.context, self.request), name=newviewname)()

Этот пример представления ищет другие представления по их имени и отображает их на месте для возврата в результате работы самого диспетчера.

Обратите внимание, что обычно я удостоверяюсь, что если представление используется, я обязательно включаю пространство имен представления @@ перед его именем, чтобы предотвратить случайное использование элемента скина с таким же именем.

person Martijn Pieters    schedule 06.06.2012
comment
Спасибо сработало красиво, спасибо. Я не уверен в добавлении «@@» к началу имени, я должен объявить представление без «@@» и использовать только «@@» в ссылке, чтобы zope пропускал обход скинов? - person Alex Volkov; 08.06.2012
comment
Точно. Очки (двойной @) на самом деле является сокращением от ++view++, который является квалификатором пространства имен URL. Различные пространства имен могут использоваться для разных целей, но представление @@ является наиболее известным. Это помогает издателю найти нужные элементы, даже если имена конфликтуют. - person Martijn Pieters; 08.06.2012