2013-07-24 14 views
2

我有一個plone表單,基本上獲取搜索詞,執行搜索,然後將用戶指向另一個表單。對於第二種形式,我需要傳遞一些變量。plone.directives表單 - 傳遞變量與重定向

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')() 

,看看我是否可以使用,作爲一個起點,傳遞變量,但只是返回我對我的搜索。

回答

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參數。

+0

這就是我現在所做的,但是我可以選擇將它發送到除.redirect()之外的下一個表單嗎?也許更好的方法是把所有東西都放在一起:我希望得到像舊的Controller Python Script/Template這樣的東西,你可以在「狀態」綁定中設置值,返回狀態,並且它會爲你處理所有的遍歷/重定向,同時傳遞這些值。 – Esoth

+0

恐怕,您必須在此手動執行此操作。查看另一個視圖,然後渲染它(通過調用視圖對象),並返回*或*我的答案中的重定向。 –