使用Python代码连接模板表单操作

时间:2013-01-13 11:43:54

标签: zope

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

我有“user”产品的以下虚拟接口和实现:

接口:

 ##
 ## 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的{​​{1}}属性找到合适的值;我得到的只是“找不到资源”。

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

1 个答案:

答案 0 :(得分: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"
    />

注册新页面后,template类的index属性被添加为NewUserSignup类,因此__call__方法可以调用它({{ 1}})并返回结果。

由于您将注册处理和模板结合在一起,因此您现在可以轻松地合并错误处理。当有人第一次加载页面时self.index()将为空,但只要有人点击提交按钮,您就可以检测到这一点并调用self.request.form方法。

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

这使得addUser易于设置;你可以把它留空,或者你可以把它设置为当前的上下文URL和视图的名称。然后,模板一起变为:

action

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