Пользовательские представления для 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, но я не нашел никаких определений представлений, поэтому я предполагаю, что представления обрабатываются с помощью одного из унаследованных дополнений.
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)()
Этот пример представления ищет другие представления по их имени и отображает их на месте для возврата в результате работы самого диспетчера.
Обратите внимание, что, как правило, я уверен, что если используется вид, я обязательно включу @@
просмотрите пространство имен перед его именем, чтобы предотвратить случайное использование элемента с таким же именем.