2015-01-09 5 views
2

Я пытаюсь получить форму z3c. Форма, чтобы заполнить свою информацию и вместо того, чтобы сделать параметр get в URL-адресе, я бы хотел использовать publishTraverse.Plone/Zope/Z3c- Что может заставить publishTraverse «не найти страницу?»?

Так вот часть моего кода:

my_object_view.py:

class EditMyObject(form.Form): 
    fields = field.Fields(IMyObject) 
    ignoreContext = False 

    myObjectID = None 

    def publishTraverse(self, request, name): 
     print "Is this firing?" 
     if self.myObjectID is None: 
      self.myObjectID = name 
      return self 
     else: 
      raise NotFound() 

    def updateWidgets(self): 
     super(EditMyObject,self).updateWidgets() 
     #set id field's mode to hidden 

    def getContent(self): 

     db_utility = queryUtility(IMyObjectDBUtility, name="myObjectDBUtility") 
     return db_utility.session.query(MyObject).filter(MyObject.My_Object_ID==self.myObjectID).one() 

    #Button handlers for dealing with form also added 

..... 
from plone.z3cform.layout import wrap_form 
EditMyObjectView = wrap_form(EditMyObject)  

В моем файле configure.zcml в папке браузера:

<configure 
    xmlns="http://namespaces.zope.org/zope" 
    xmlns:five="http://namespaces.zope.org/five" 
    xmlns:genericsetup="http://namespaces.zope.org/genericsetup" 
    xmlns:zcml="http://namespaces.zope.org/zcml" 
    xmlns:browser="http://namespaces.zope.org/browser" 
    i18n_domain="my.object"> 

    <browser:page 
     name="myobject-editform" 
     for="*" 
     permission="zope2.View" 
     class=".my_object_view.EditMyObjectView" 
    /> 

</configure> 

я смог он работает, когда я использовал параметр get в URL-адресе, но когда я пытаюсь использовать publishTraverse, я получаю сообщение об ошибке страницы. Что странно, что когда

Это то, что мой URL выглядит, кстати, когда я пытаюсь использовать публиковать траверс:

http://localhost:8190/MyPloneSite/@@myobject-editform/1 

Когда я выхожу из 1, но сохранить «/», это все еще находит страницу. Что я делаю неправильно, что вызывает это?

ответ

5

Издатель Zope не будет называть publishTraverse, если вы не заявите, что представление предоставляет интерфейс IPublishTraverse. Вы должны добавить это в свой класс:

from zope.publisher.interfaces.browser import IPublishTraverse 
from zope.interface import implementer 

@implementer(IPublishTraverse) 
class EditMyObject(form.Form): 
    etc... 

Вам также необходимо избавиться от вида вашей обложки. Используя обертку, Zope пересекает оболочку, проверяет, обеспечивает ли она IPublishTraverse, обнаруживает, что это не так, и отказывается. Вместо этого просто зарегистрируйте форму непосредственно в виде:

<browser:page 
    name="myobject-editform" 
    for="*" 
    permission="zope2.View" 
    class=".my_object_view.EditMyObject" 
/> 
+0

Это может определенно вызвать это. К сожалению, в моем случае, хотя я и добавил это, я все еще получаю сообщение, не найденное страницей. Возможно, что-то не так с моим кодом configure.zcml или wrapper. Я вношу изменения в вопрос, чтобы включить их. –

+0

Я добавил абзац о том, что не использую представление оболочки. –

+0

Благодарим вас за ответ. Я смог заставить его работать. Спасибо, что нашли время. Теперь я лучше разбираюсь в публикации. –

 Смежные вопросы

  • Нет связанных вопросов^_^