python – 处理Plone模板中的表单提交
作者:互联网
我有一个带有视图类的页面模板.在页面模板中,我有一个提交到同一页面的按钮,即
<form method="post" tal:attributes="action request/getURL" >
<input type="hidden" name="filename" value="" tal:attributes="value python:item['filename']" />
<input type="submit" name="form.action.convert" value="Convert" />
</form>
提交表单时,将调用视图类.
class Html(BrowserView):
def __init__(self, context, request):
self.request = request
self.context = context
def __call__(self):
# Is this a form submission via POST?
req = self.request
if req.get('REQUEST_METHOD', 'POST') and \
req.form.get('form.action.convert', '') == 'Convert':
self.convert_document(self.context, str(req.form.get('filename', '')))
def convert_document(self, contextObj, fileToConvert):
""" Do something """
return None
现在,问题是我无法将逻辑放在__init__方法中,因为多次调用此方法,只需单击一次即可生成多个表单提交.但是,单击按钮时会调用__call__方法一次,但遗憾的是,如果单击链接查看视图中的当前内容项,则不会发生任何事情,因为__call__方法被调用且没有任何反应.
我不能在__call__方法中使用下面的代码.浏览器会抱怨页面以永不停止的方式重定向.
self.context.REQUEST.response.redirect( self.context.absolute_url() )
在Plone的页面模板中处理表单提交有更好的方法吗?如何从页面模板中调用视图类中的方法(即convert_document)?
解决方法:
首先,对您的代码进行一些评论,可以简化和改进:
最佳做法是让您的表单使用视图的absolute_url()方法;它是规范的URL,而如果您的视图包含在其他地方,请求/ getURL可能包括获取奇怪或错误的URL:
<form method="post" tal:attributes="action view/absolute_url" >
<input type="hidden" name="filename" value="" tal:attributes="value item/filename" />
<input type="submit" name="form.action.convert" value="Convert" />
</form>
文件名输入框tal表达式只能使用路径表达式,这些对字典工作就好了.
您不需要重新定义__init__方法,BrowserView类已经为您提供了这个方法.
为了测试表单是否已提交,我们通常只测试请求中存在的提交按钮,您的测试比需要的更详细:
def __call__(self):
if 'form.action.convert' in self.request.form:
self.convert_document()
因为convert_document是您查看的方法,所以它本身可以访问self.context和self.request.form [‘filename’],从而简化您的方法签名.由于您现在知道您的表单已提交,因此您可以指望self.request.form [‘filename’]存在并成为字符串;如果不是某人已经手动修改请求并且事情应该破坏,所以我通常不会在这种情况下使用get(…,”).
视图必须始终在__call__方法中完成所有工作,因为在遍历期间调用__init__,此时此类关键信息尚未确定.您不需要通过上下文访问重定向方法的响应,只需从self.request属性访问它,但请记住返回结果:
return self.request.response.redirect(self.context.absolute_url())
但是,如果您的视图是上下文对象的默认视图,那么这确实会导致浏览器无法容忍的重定向循环.
请注意,如果您覆盖具有与之关联的模板的BrowserView视图类的__call__方法,则需要确保在适当的位置返回模板的输出.因此,我对你的观点课的刺激是:
class Html(BrowserView):
def __call__(self):
if 'form.action.convert' in self.request:
self.convert_document()
return self.request.response.redirect(self.context.absolute_url())
return self.index()
def convert_document(self):
""" Do something """
context = self.context
filename = self.request.form['filename']
# Do something with the context and filename
标签:python,plone 来源: https://codeday.me/bug/20190826/1726127.html