2017-08-30 44 views
0

使用Flask和Flask-WTF,我想要重定向到具有複選框的表單的頁面。 我有一個名爲「SearchForm」的初始搜索頁面,在用戶搜索後,我將他重定向到一個結果頁面,該結果頁面上有相同的SearchForm,後面是結果列表視圖。這使用戶能夠在結果頁面上再次搜索。將重定向中的Flask-WTForms表單中的複選框值傳遞迴相同的表單

這是我的形式:

class SearchForm(Form): 
    """Search form class""" 
    from app.utils.translation import Translation 

    criteria = StringField(Translation.label('search'), validators=[DataRequired()]) 
    all_employees = BooleanField(Translation.label('all_employees'), validators=[]) 

現在,當用戶提交表單時,我可以實例它像這樣:

form = SearchForm(request.form) 

我可以用得到的數據(例如) :

form.data['all_employees'] 

如果我不選中複選框,WTForms正確分析all_employees爲。 我重定向到具有相同表單的結果頁面,我想用該用戶剛剛提交的數據呈現該表單。所以我這樣做:

return redirect(url_for('employees.search', 
         criteria=form.data["criteria"], 
         all_employees=form.data["all_employees"] 
         )) 

在searchform,我再次實例的形式,與查詢字符串(URL)變量:

form = SearchForm(request.args) 

現在的問題是,由於form.data [ 'all_employees' ] 的值爲「False」,複選框被選中。這對於HTML來說是正常的行爲,只有在檢查框時纔會傳遞複選框值。所以如果有一個值(和「假」的值),複選框被檢查。

我可以解決此使用這樣的事情在我的重定向:

all_employees='y' if form.data['all_employees'] else '' 

但是,這意味着我必須不斷地做,在每家每戶的複選框場重定向。我有很多類似的屏幕,我希望以這種方式實現。

我可以想象,WTforms也可以以某種方式解析複選框的「falsy」值,而不是在這些情況下選中框,但如果甚至可能找不到任何文檔。

我也考慮過在結果頁面上處理它,並且如果值爲「falsy」,那麼從request.args集合中刪除一個變量,但也會感覺到kludgy。

也許有另一種方式做到這一點,我不知道,或者我的解決方法只是用複選框處理重定向的方式,我不知道,但在我看來,這是Flask-WTForms可能會有某種解決方案的一個非常常見的用例。

任何意見,將不勝感激。

EDIT

問題是更大;我只注意到傳遞一個空字符串,我的重定向,使用此代碼:

all_employees='y' if form.data['all_employees'] else '' 

並隨後實例化和呈現形式使用:

form = SearchForm(request.args) 

將呈現空複選框爲:

<input id="include_inactive" name="include_inactive" type="checkbox" value=""> 

因此,之後再檢查一次,會將一個空字符串傳遞給Flask,所以當一個複選框被取消選中一次時,它將會有一個空值渲染,並且它會c永遠不會再被檢查。

回答

0

在非常基本的情況下,urlencoded字符串otherdata=value&all_employees=False是從HTML複選框角度看的一個真值。

WTForms 主要是遵循HTML表單和表單數據的規則。然而,由於這個布爾值事物是一個普通的寵物狗,你可以使用false_values關鍵字參數可以定製這個關鍵字參數來定義'falsey'值...你可以讓false_values包括字符串False

的替代方法,更「HTML規範友好」將是一個幫手是這樣的:

def url_for_form(urlname, form, **kwargs): 
    for field in form: 
     if field.data: # would exclude blank strings too 
      kwargs[field.name] = field.data 

    return url_for(urlname, **kwargs) 

使用會像url_for_form('blah.search', form, otherparam=9)

如果你需要選擇特定的字段出來,然後你可以稍微不同地設計它。

+0

我實際上已經嘗試過「false_values」參數,但隨後出於某種原因,WTForms呈現了默認值「False」而不是「y」的複選框。這會讓事情變得糟糕,因爲然後一個複選框會通過「False」,所以我放棄了這種方法。然而,你的幫手對於這個問題是一個很好和乾淨的解決方法。我想我可以用這個工作。 –

相關問題