我正在一个有“注册”页面的网站上工作,该页面应该可以在网站的任何地方进行调用。
我有“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,
答案 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
请注意表单输入如何预先填充请求中的现有数据,使访问者更容易纠正他们可能犯的任何错误。