2

我有一个 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')()

看看我是否可以用它作为传入变量的起点,但这只会让我回到我的搜索。

4

1 回答 1

2

发出重定向时,不考虑(也不应该)在请求对象上设置的参数。

而是将查询字符串附加到重定向 URL;urllib.urlencode()出色地完成了这项工作:

from urllib import urlencode

self.request.response.redirect('@@my-results?' + urlencode({'myvar': results['myvar']}))

.redirect()调用返回一个303 See Other 响应,其中您在方法中传递的 URL 作为Location标头;浏览器随后会打开该新位置,并将包含您添加到 URL 的任何 GET 参数。

于 2013-07-24T19:18:32.630 回答