Plone 4表视图解决方法

2024-06-26 14:10:31 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个自定义视图,以避免在plone4的表视图中显示错误的事件开始和结束时间的错误。但是,当我调用我的视图时,我得到以下错误:

Traceback (innermost last):
Module ZPublisher.Publish, line 116, in publish
Module ZPublisher.BaseRequest, line 498, in traverse
Module ZPublisher.BaseRequest, line 343, in traverseName
Module ZPublisher.BaseRequest, line 110, in publishTraverse
Module zope.component._api, line 122, in queryMultiAdapter
Module zope.component.registry, line 240, in queryMultiAdapter
Module zope.interface.adapter, line 522, in queryMultiAdapter
TypeError: __init__() takes exactly 2 arguments (3 given)

我创建视图已经有一段时间了,但是我认为(根据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):来看看两个参数是否真的会改变任何东西,它会给出完全相同的错误。在

我正在macosxsnowleopard上的plone4.0.2站点(在python2.6.6virtualenv中)进行测试

浏览器从浏览器查看注册/配置.zcml(我把这个放到了我也在研究的主题中)。我调用http://localhost:8080/plone/events/new_events_view查看视图的外观并得到上面的错误。我还尝试在portal\u类型中为topic注册视图,当导航到http://localhost:8080/plone/events时,它会给我这个错误,直到我删除该视图。在

^{pr2}$

任何帮助都将不胜感激。在

另外,我知道这是一小段代码,但是如果你认为可以用更好的方式来完成,我是一个学生,总是在寻找改进的方法。在

谢谢


Tags: inself视图zopeinit错误contextline
3条回答

更好的解决方法是从ATContentTypes皮肤层定制formatCatalogMetadata.py皮肤脚本。在

替换行读数:

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

有:

^{pr2}$

事件视图表对事件再次起作用。在

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

相关问题 更多 >