我有一个plone表单,基本上获取搜索条件,执行搜索,然后将用户指向另一个表单。对于第二种形式,我需要传递几个变量。
class MySearch(form.SchemaForm):
grok.context(IMyContext)
grok.name('my-search')
ignoreContext = True
schema = ISearchSchema
@button.buttonAndHandler(_(u'Search Method'))
def searchMethod(self, action):
""" group update/removal """
data, errors = self.extractData()
if errors:
self.status = self.formErrorsMessage
return
results = somecall(data['term'])
if results:
self.request.set('myvar',results['myvar'])
self.request.response.redirect('@@my-results')
else:
IStatusMessage(self.request).addStatusMessage(_(u"No results found"),"info")
return
这不起作用 - 我想会生成一个新请求,因此myvar会立即丢失。我可以将它放在查询字符串中并将其包含在重定向中,但如果可能的话,更愿意将其作为POST数据发送。我也试过像
这样的东西return getMultiAdapter((self.context,self.request),name='my-results')()
看看我是否可以将其作为传递变量的起点,但这只会让我回到my-search。
答案 0 :(得分:2)
发出重定向时,不会考虑请求对象上设置的参数(也不应该考虑它们)。
将查询字符串附加到重定向URL; urllib.urlencode()
令人钦佩地完成了这项工作:
from urllib import urlencode
self.request.response.redirect('@@my-results?' + urlencode({'myvar': results['myvar']}))
.redirect()
调用返回303 See Other response,其中您在方法中传递的网址为Location
标头;然后浏览器打开该新位置,并包含您添加到URL的任何GET参数。