编程语言
首页 > 编程语言> > python – 处理Plone模板中的表单提交

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