在 Flask 应用程序中使用 wtforms select 字段获取 "Not a valid choice",我做错了什么?
Getting "Not a valid choice" with wtforms select field in Flask app, what am I doing wrong?
全部。我正在开发 Flask 应用程序。我正在为一家带有在线订购系统的餐厅开发一个网站。我正在为一个朋友做这件事,并将其作为一种学习经历。我要问的问题可能是一个小问题。我不确定问题更多的是 wtforms 还是 flask-wtf。希望有人能提供一些见解。
我正在创建一个购物车,其中包含一些通过 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
下方看到 "Not a valid choice" ] 按钮。我认为这会让用户感到困惑。我不确定如何删除它。这是屏幕截图:
只有当我使用 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'))
功能很好。该网站按我希望的方式运行,只是出于某种原因,我收到 "Not a valid choice" 错误。这仅在我使用删除项目或清除购物车按钮之一时出现。
我认为问题在于这一行:
if order_type.validate_on_submit() and order_type.submit.data:
此处您无条件地验证了 OrderType
表单,因此只要您单击其他按钮,此表单的验证就会失败,因为 select 下拉列表没有值。
尝试将条件的两部分颠倒过来,如下:
if order_type.submit.data and order_type.validate_on_submit():
这样,只有当该表单的提交按钮有值时才会进行验证,这表明这是用户提交的表单。
全部。我正在开发 Flask 应用程序。我正在为一家带有在线订购系统的餐厅开发一个网站。我正在为一个朋友做这件事,并将其作为一种学习经历。我要问的问题可能是一个小问题。我不确定问题更多的是 wtforms 还是 flask-wtf。希望有人能提供一些见解。
我正在创建一个购物车,其中包含一些通过 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
下方看到 "Not a valid choice" ] 按钮。我认为这会让用户感到困惑。我不确定如何删除它。这是屏幕截图:
只有当我使用 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'))
功能很好。该网站按我希望的方式运行,只是出于某种原因,我收到 "Not a valid choice" 错误。这仅在我使用删除项目或清除购物车按钮之一时出现。
我认为问题在于这一行:
if order_type.validate_on_submit() and order_type.submit.data:
此处您无条件地验证了 OrderType
表单,因此只要您单击其他按钮,此表单的验证就会失败,因为 select 下拉列表没有值。
尝试将条件的两部分颠倒过来,如下:
if order_type.submit.data and order_type.validate_on_submit():
这样,只有当该表单的提交按钮有值时才会进行验证,这表明这是用户提交的表单。