繁体   English   中英

Plone 4表格视图变通

[英]Plone 4 Table View Work Around

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

追溯(最里面的最后):
模块ZPublisher.Publish,行116,在publish中
遍历模块ZPublisher.BaseRequest,第498行
traverseName中的模块ZPublisher.BaseRequest,第343行
publishTraverse中的模块ZPublisher.BaseRequest,第110行
queryMultiAdapter中的模块zope.component._api,第122行
queryMultiAdapter中的模块zope.component.registry,第240行
queryMultiAdapter中的模块zope.interface.adapter,第522行
TypeError: __init__ ()恰好接受2个参数(给定3个)

自从创建视图以来已经有一段时间了,但是我认为__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):而已__init__(self, context):仅查看2个参数是否真的会改变任何东西,并且给出完全相同的错误。

我正在Mac OS X Snow Leopard上的Plone 4.0.2站点(在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"
      />

任何帮助将不胜感激。

另外,我知道这只是一小段代码,但是如果您认为可以以更好的方式完成,请把它拆开,我一直在寻找改进的方法。

谢谢

更好的解决方法是从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::'):

事件视图表将再次用于事件。

无论如何,您都不应在浏览器视图的__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__()

但这是python

类方法的定义是:

def __init__(context, request):

默认情况下会理解self (因为该方法称为Class.__init__(context,request) )(或者再次简称为Class() )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM