0

我正在一个网站上工作,该网站有一个“注册”页面,应该可以从网站的任何地方调用。

我为“用户”产品提供了以下虚拟接口和实现:

界面:

 ##
 ## located in bahmanm/sampleapp/interfaces.py
 ##
 class ISampleAppUser(Interface):
        """
        """

执行:

 ##
 ## located in bahmanm/sampleapp/implementation/SampleAppUser.py
 ##
 class SampleAppUser:
      """
      """

      implements(ISampleAppUser)

 # Note that this method is outside of the implementation class.
 #
 def manage_addSampleAppUser(self, id, title):
    # ...

现在,暂时让我们假设index页面上有一个链接指向以下模板(注册模板):

 <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns="http://xml.zope.org/namespaces/tal">
   <head><title>Add a new User</title></head>
   <body>
    <h2>Add a user instance</h2>
    <form action="#" method="POST"
          tal:attributes="action python:'manage_addSampleAppUser'">
       <p>Id: <input type="text" name="id"/></p>
       <p>Title: <input type="text" name="title"/></p>
       <input type="submit" value="Add"/>
    </form>
   </body>
  </html>

但是,我无法为;的action财产找到合适的价值。form我得到的只是“找不到资源”。

老实说,我认为这是我理解 Zope 机制的问题。我真的很感激关于我应该去哪里挖掘解决方案、configure.zcml实现或模板本身的任何提示/线索。TIA,

4

1 回答 1

1

您真的想为此创建一个视图;您也可以从 URL 调用这样的产品工厂,但不建议这样做。

使用视图,您可以结合表单和代码在一个地方创建新用户:

from zope.publisher.browser import BrowserPage
from sampleapp.implementation.SampleAppUser import manage_addSampleAppUser


class NewUserSignup(BrowserPage):
    def __call__(self):
        # called when the view is being rendered
        if 'submit' in self.request:
            # form was submitted, handle
            self.addUser()
        return self.index()  # render the template

    def addUser(self):
        # extract form fields from self.request.form
        # validation, error handling, etc.
        if someerror:
            self.error = 'Error message!'
            return

        user = manage_addSampleAppUser(self.context, id, title)
        # add things to this new user if needed

        # all done, redirect to the default view on the new user object
        self.request.response.redirect(user.absolute_url())

然后使用以下内容注册此视图:

<browser:page
    for="*"
    name="signup"
    class=".signup.NewUserSignup"
    template="signup.pt"
    permission="zope.public"
    />

当您的新页面被注册时,namedtemplate将作为index属性添加到您的NewUserSignup类中,因此该__call__方法可以调用它 ( self.index()) 并返回结果。

因为您将注册处理和模板结合在一起,所以您现在可以轻松地合并错误处理。当有人第一次加载页面时self.request.form会是空的,但是一旦有人点击提交按钮,你就可以检测到这一点并调用该addUser方法。

该方法可以创建用户然后从该页面重定向,或者设置错误消息并返回,此时重新呈现表单。

这使得action易于设置;您可以将其留空,或者您可以将其设置为当前上下文 URL 加上视图的名称。然后,模板一起变成:

<html xmlns="http://www.w3.org/1999/xhtml"
        xmlns="http://xml.zope.org/namespaces/tal">
   <head><title>Add a new User</title></head>
   <body>
    <h2>Add a user instance</h2>
    <div class="errormessage" tal:condition="view/error|nothing" tal:content="view/error">
        Conditional error message appears here
    </div>

    <form action="#" method="POST"
          tal:attributes="action string:${context/absolute_url}/@@${view/__name__}">
       <p>Id: <input type="text" name="id"
                      tal:attributes="value request/form/id|nothing" /></p>
       <p>Title: <input type="text" name="title"
                      tal:attributes="value request/form/title|nothing" /></p>
       <input type="submit" value="Add" name="submit"/>
    </form>
   </body>
</html>

请注意表单输入是如何预先填充来自请求的现有数据的,从而使您的访问者更容易纠正他们可能犯的任何错误。

于 2013-01-13T12:56:35.200 回答