2015-10-19 22 views
1

全部。我正在開發一個Flask應用程序。我正在開發一個網上訂餐系統的網站。我正在爲朋友做這件事,並把它當作一種學習體驗。我要問的問題可能是一個小問題。我不確定問題是否更多與wtforms或flask-wtf。希望有人能提供一些見解。Flask應用程序中的wtforms選擇字段出現「不是有效的選擇」,我做錯了什麼?

我正在創建一個購物車,並通過wtf.quick_form呈現幾個按鈕。下面是:

<div id='cart'> 
    <div> 
     <p> 
     <center><b>Shopping cart</b></center> 
     </p> 
     <div> 
      {% for item in requested_item_record %} 
      <div id='cartI'>{{list_of_items[item]['name']}}</div> 
      <div id='cartB'> {{ wtf.quick_form(remove_item_dict[item]) }}</div> 
      {% endfor %} 
     </div> 
     <p id='cartT'>Subtotal: {{ total_cost/100 }} </p> 

     <p id='cartT'>Tax: {{ tax/100 }}</p> 

     <p id='cartT'>Total: {{ total/100 }}</p> 

     <div id='cartB'>{{ wtf.quick_form(clear_cart) }}</div> 
     <div id='cartB'>{{ wtf.quick_form(order_type) }}</div> 
    </div> 
</div> 

這裏是由wtforms定義的按鈕:

class AddItem(Form): 
     submit = SubmitField("Add item to cart") 

class ClearCart(Form): 
     submit = SubmitField("Clear cart") 

class RemoveItem(Form): 
     submit = SubmitField("Remove item") 

class OrderType(Form): 
     select = SelectField("Pickup or delivery?", choices=[('pickup','Pickup'),('delivery','Delivery')]) 
     submit = SubmitField("Proceed to checkout") 

問題是我從OrderType按鈕看到SelectField下面「不是一個有效的選擇」 。我認爲這會讓用戶感到困惑。我不知道如何刪除它。下面是截圖:

enter image description here

我只看到的行爲,如果我與RemoveItem按鈕中的一個或ClearCart按鈕提交數據。

這是我的看法功能的相關部分:

# generate add buttons for all items of the menu 
button_dict = OrderedDict([]) 
for i in range(number_of_submit_buttons): 
    button_dict[i] = AddItem(prefix='add item ' + str(i)) 
clear_cart = ClearCart(prefix="clear cart") 

# check for submit data from users, remove an item or clear cart. 
for iterable, add_button in enumerate(button_dict): 
    if button_dict[add_button].validate_on_submit and button_dict[add_bu$ 
     session['requested_item_record'].append(iterable) 
     session['total_cost'] += list_of_items[iterable]['price'] 
if clear_cart.validate_on_submit and clear_cart.submit.data: 
    session['requested_item_record'] = [] 
    session['total_cost'] = 0 

# select field, for delivery or pickup 
order_type = OrderType(prefix='order_type') 
if order_type.validate_on_submit() and order_type.submit.data: 
     if order_type.select.data == 'delivery' and session['requested_i$ 
      return redirect(url_for('transaction.get_address')) 
     elif order_type.select.data == 'pickup' and session['requested_i$ 
      return redirect(url_for('transaction.checkout')) 

的功能是好的。該網站的工作方式,我想如何,只是由於某種原因,我得到這個錯誤「不是一個有效的選擇」。這僅在我使用刪除項目或清除購物車按鈕之一時出現。

+0

查看功能,還是單功能?如果你已經在一個視圖下獲得了所有的代碼,那麼點擊其他表單上的按鈕將會使得'order_type'的'validate_on_submit()'函數失敗,這會給你帶來的錯誤。將它們拆分成不同的視圖,或者檢測哪個表單正在提交,並且只處理該表單的邏輯。 – Doobeh

+0

感謝您的關注。我認爲這將解決它。我明天會看看這個。如果你喜歡,你可以寫一個答案。 – wgwz

+0

我已經在使用[此方法](http://librelist.com/browser/flask/2010/9/12/flask-wtf-multiple-form-per-view/#d8cfeff63b89d028919d4617ed642d15)來識別不同的提交按鈕。正如我所說,功能工作得很好。每次點擊其中一個按鈕時,它都會執行我想要的任務,而不會出現任何錯誤。但我得到「不是有效的選擇」。所以問題仍然存在。 – wgwz

回答

1

的問題是,我認爲,在這條線:

if order_type.validate_on_submit() and order_type.submit.data: 

在這裏,你無條件地驗證OrderType形式,讓你在其他按鈕點擊驗證這種形式隨時會因失敗選擇下拉菜單沒有價值。

嘗試扭轉條件的兩個部分,具體如下:

if order_type.submit.data and order_type.validate_on_submit(): 

通過這種方式,驗證將只完成時,表單中的提交按鈕具有價值,這表明這就是形式由用戶提交。

相關問題