Plone 4表查看工作

时间:2011-04-08 19:54:59

标签: python plone

我正在编写一个自定义视图来解决在Plone 4中显示表视图中事件的错误开始和结束时间的错误。但是,当我调用我的视图时,我收到以下错误:

  

追溯(最里面):
    模块ZPublisher.Publish,第116行,在发布中     模块ZPublisher.BaseRequest,第498行,在遍历中     模块ZPublisher.BaseRequest,第343行,以traverseName为单位     模块ZPublisher.BaseRequest,第110行,在publishTraverse中     在queryMultiAdapter中的模块zope.component._api,第122行     模块zope.component.registry,第240行,在queryMultiAdapter中     模块zope.interface.adapter,第522行,在queryMultiAdapter中   TypeError:__init__()只需要2个参数(给定3个)

自从我创建了一个视图以来已经有一段时间了,但我认为(根据this__init__()确实需要3个参数(自我,上下文,请求)。无论如何,这是我的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个参数是否会真正改变任何事情都会给出完全相同的错误。

我在Mac OS X Snow Leopard的Plone 4.0.2网站上测试(在Python 2.6.6 virtualenv中)

浏览器/ configure.zcml中的BrowersView注册(我将其投入到我正在使用的主题中)。我调用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 个答案:

答案 0 :(得分:1)

更好的解决方法是从ATContentTypes外观层自定义formatCatalogMetadata.py外观脚本。

替换行读数:

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 :(得分:1)

您不应该在浏览器视图的__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__()

答案 2 :(得分:-1)

但它是 python

类方法的定义是:

def __init__(context, request):
默认情况下

self被理解(因为该方法被称为Class.__init__(context,request))(或者,再次缩写为Class())。