我正在编写一个自定义视图来解决在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"
/>
非常感谢任何帮助。
另外,我知道这是一小段代码,如果你认为可以以更好的方式完成,那就把它分开吧,我是一名学生,总是想方设法改进。
由于
答案 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()
)。