2011-04-08 60 views
0

我正在編寫一個自定義視圖來解決在Plone 4的表視圖中顯示事件的錯誤開始和結束時間的錯誤。但是,當我調用我的視圖時,出現以下錯誤:Plone 4 Table View解決方案

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個參數(個體經營,上下文請求)。無論如何這裏就是我的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個參數是否真的會改變任何東西,並給出完全相同的錯誤。

我(在Python 2.6.6的virtualenv)從瀏覽器/ configure.zcml中

BrowersView註冊測試這個在Mac OS X Snow Leopard的一個Plone 4.0.2網站(我扔進一個主題此我也在工作)。我打電話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

對於記錄:回溯指出'__init__'方法只發現了需要兩個參數,同時主叫方試圖在第3的製作傳遞你會怎樣。 – 2011-04-08 21:20:31

+0

是的,我抓住了,我不知道這個'__init__'是在哪裏,因爲正如我上面所說,無論我如何改變'__init__'爲我的看法,我得到相同的結果。 – keiththomps 2011-04-08 21:37:00

+0

您能提供關於此視圖的ZCML註冊的更多詳細信息,以及您從哪裏導入BrowserView?另外,你用什麼URL訪問視圖? – 2011-04-09 08:50:15

回答

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__() 
+0

你讓我回答了,雖然我不需要'__call__'。顯然,我使用了錯誤的BrowserView(從Products.Five import BrowserView)。只要我改變了我在plone bug方面的工作就像一個魅力,謝謝 – keiththomps 2011-04-13 17:25:25

-1

但它蟒蛇

一類方法的定義是:

def __init__(context, request): 

self被默認理解(因爲該方法被稱爲Class.__init__(context,request))(或,再次,縮短到Class())。

+0

再來一次? '__init__'不是一個classmethod,並且絕對是一個自我參數! – 2011-04-08 21:12:44

+0

另外,請參閱http://docs.python.org/tutorial/classes.html#class-objects :-) – 2011-04-08 21:15:18

+0

你說得對,我把它寫回去了。 ** def **需要一個自我參數,但是您不會傳遞** self **參數,因爲它是隱含的。 – Auspex 2011-04-09 02:17:17

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::'): 

和事件視圖表事件再次合作。

+0

這適用於糾正事件生效日期的格式,但開始和結束日期保持4個小時。在測試事件的portal_catalog中,開始日期顯示爲「2011/04/09 11:00:00 GMT-4」,但在事件的表格視圖中顯示爲「2011年4月9日07:00 AM」 – keiththomps 2011-04-08 22:48:35

+0

有問題的腳本似乎對時區無知;這肯定可以做一些改進。 – 2011-04-08 22:53:23