Plone 4 Table View Работа вокруг - PullRequest
0 голосов
/ 08 апреля 2011

Я пишу пользовательское представление, чтобы обойти ошибку, которая отображает неправильное время начала и окончания событий в табличном представлении в Plone 4. Однако, когда я вызываю мое представление, я получаю следующую ошибку:

Трассировка (самая последняя):
Модуль ZPublisher.Publish, строка 116, в публикации
Модуль ZPublisher.BaseRequest, строка 498, в ходу
Модуль ZPublisher.BaseRequest, строка 343, в traverseName
Модуль ZPublisher.BaseRequest, строка 110, в publishTraverse
Модуль zope.component._api, строка 122, в запросе MultiAdapter
Модуль zope.component.registry, строка 240, в запросе MultiAdapter
Модуль zope.interface.adapter, строка 522, в queryMultiAdapter
Ошибка типа: __init__ () принимает ровно 2 аргумента (задано 3)

Прошло некоторое время с тех пор, как я создал представление, но я подумал (в соответствии с this ), что __init__() действительно принимает 3 аргумента (self, context, request). Во всяком случае, вот как выглядит мой класс BrowserView на данный момент:

class NewEventsView(BrowserView):
    """Custom View for displaying events in a table with correct times"""

    implements(INewEventsView)

    def getCurrentEvents(self):
        """Method to return all active events in order"""
        current_events = []
        cat = getToolByName(self.context, 'portal_catalog')
        brains = cat(portal_type='Event', review_state='published', sort_on='start')
        for x in brains:
            event = x.getObject()
            if event.startDate > DateTime():
                current_events.append(event)
        return current_events

Я пробовал разные варианты этого добавления __init__, как показано на вышеупомянутой странице, и просто ради того, чтобы дать ему __init__(self, context):, просто чтобы посмотреть, действительно ли 2 аргумента что-то изменят, и это даст точно такая же ошибка.

Я тестирую это на сайте Plone 4.0.2 в Mac OS X Snow Leopard (в python 2.6.6 virtualenv)

Регистрация BrowersView из browser / configure.zcml (я добавил это в тему, с которой я также работал). Я звоню http://localhost:8080/plone/events/new_events_view, чтобы посмотреть, как выглядит вид, и получить вышеуказанную ошибку. Я также попытался зарегистрировать представление в portal_types для темы, и при переходе к http://localhost:8080/plone/events эта ошибка будет отображаться до тех пор, пока я не удалю представление.

  <browser:page
      for="*"
      name="new_events_view"
      class=".newEventsView.NewEventsView"
      template="newEventsView.pt"
      permission="zope.Public"
      allowed_interface=".interfaces.INewEventsView"
      />

Любая помощь будет принята с благодарностью.

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

Спасибо

Ответы [ 3 ]

1 голос
/ 09 апреля 2011

Гораздо лучшим решением будет настройка скрипта formatCatalogMetadata.py из слоя обложки ATContentTypes.

Заменить строку следующим образом:

if same_type(value, '') and value[4:-1:3] == '-- ::':

с:

if same_type(value, '') and (value[4:-1:3] == '-- ::' or value[4:19:3] == '--T::'):

и таблицы представления событий снова работают для событий.

1 голос
/ 09 апреля 2011

Вы не должны в любом случае добавлять код в метод __init__ браузера. Если вы хотите, чтобы некоторый пользовательский код поместил его в методы класса представления или переписал метод __call__. Представление создается до того, как контекст безопасности становится доступным, и может создаваться несколько раз за запрос. Это может привести к множеству неожиданных эффектов, если вы выполняете какую-то нетривиальную работу в нем - поэтому лучше просто избегать каких-либо действий там.

В Plone 4 вы бы написали пользовательский __call__ как:

from zope.publisher.browser import BrowserView

class MyView(BrowserView):

    def __call__(self):
        # do some work
        return super(MyView, self).__call__()
0 голосов
/ 09 апреля 2011

Но это python !

Определение метода класса:

def __init__(context, request):

self понимается по умолчанию (потому что метод вызывается какClass.__init__(context,request)) (или, опять же, сокращено до Class()).

...