2016-02-11 44 views
0

我剛學習Flask,我想在我的視圖中有兩個頁面:搜索頁面有一個表單,用戶可以在其中輸入一些參數,而視圖結果頁面(其中I還沒有寫入)只會顯示搜索結果。將數據重定向到Flask中的下一個視圖

現在我無法讓搜索頁面將表單數據重定向到查看結果頁面。我期望查看結果頁面位於一個URL中,其中包含查詢字符串,如/search/?=...,然後當然,我需要能夠在view_results()中輕鬆訪問該數據。

當我通過form.dataview_results(),下面,我得到的形式在該URL和data字典...這是有道理的,我認爲......但不是很我想要什麼的字符串表示。我想我誤解這...

@main.route('/search/', methods=['GET', 'POST']) 
def search(): 
    form = SearchForm() 
    if form.validate_on_submit(): 
     return redirect(url_for('.view_results', data=form.data)) 
    return render_template('search.html', form=form) 

@main.route('/search/<data>') 
def view_results(data): 
    return "placeholder" 
+0

千萬不要錯過' 'form.data''到視圖,通過''form.field.data''。用你的字段名替換該字段 –

+0

@AliFaki哦,我明白了......一次只傳一個並在路由中自己構建查詢字符串?例如'@ main.route('/ search/results?field1 = &field2 = &field3 = ')' – KaleidoEscape

回答

0

要回答我的問題(雖然有可能是我只是不知道一個簡單的和更好的方法,但這裏是我落得這樣做,現在)...

我創建了一個自定義路由轉換器(用於執行此操作的方法描述爲here),並將其註冊到我的應用中,以便我可以在我的view_results()路由中使用它。我說這個我utils.py,我在同一個目錄中我的應用程序的初始化:

from werkzeug.routing import BaseConverter 

class DictionaryConverter(BaseConverter): 
    """Convert python dictionary to URL query string and back.""" 

    def to_python(self, value): 
     d = {} 
     for item in value.split('&'): 
      k, v = item.split('=') 
      if k != 'csrf_token': 
       d[k] = v 
     return d 

    def to_url(self, values): 
     pairs = [] 
     for k in values: 
      #don't expose the csrf token in the query string 
      if k != 'csrf_token': 
       pairs.append('{}={}'.format(k, values[k])) 
     return '&'.join(BaseConverter.to_url(self, value=pair) for pair in pairs) 

然後在我的應用程序__init__.py我確信初始化程序後註冊自定義轉換器,但是加載使用的藍圖前它(我main藍圖):

app = Flask(__name__) 

# ... 

from .utils import DictionaryConverter 
app.url_map.converters['dict'] = DictionaryConverter 

from .main import main as main_blueprint 
app.register_blueprint(main_blueprint) 

我的搜索視圖從request.form發送數據(這是該數據去上崗)一起的結果視圖。我使用code=303來消除歧義,並且使用make certain the request is sent as a GET,但這可能不是什麼大問題。

@main.route('/search/', methods=['GET', 'POST']) 
def search(): 
    form = SearchForm() 
    if form.validate_on_submit(): 
     return redirect(url_for('.view_results', data=request.form), code=303) 
    return render_template('search.html', form=form) 

最後,我的結果視圖使用新的轉換器,然後我可以按通常(正如你所看到的,我還沒有真正做任何事的又訪問數據,但現在我應該是能夠啓動):

@main.route('/search/results?<dict:data>') 
def view_results(data): 
    for i in data: 
     print(i, data[i]) 
    return "placeholder" 

這似乎是工作,但我還是覺得我只是缺少從瓶的東西很明顯,不會要求創建一個自定義轉換器...

相關問題