plone.directives表单 - 使用重定向传递变量

时间:2013-07-24 18:38:18

标签: plone

我有一个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。

1 个答案:

答案 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参数。