繁体   English   中英

在Flask应用程序中使用wtforms select字段获取“无效选择”,我在做什么错?

[英]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下方看到“无效选择” 我认为这会使用户感到困惑。 我不确定如何将其删除。 这是屏幕截图:

在此处输入图片说明

仅当我使用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'))

功能很好。 该网站可以按我希望的方式运行,只是出于某种原因,我收到此错误“无效选择”。 仅当我使用“删除项目”或“清除购物车”按钮之一时,此按钮才会显示。

我认为问题在于:

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

在这里,您无条件地验证OrderType表单,因此,每当单击其他按钮时,由于select下拉列表没有值,因此对该表单的验证将失败。

尝试反转条件的两个部分,如下所示:

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

这样,仅当该表单的“提交”按钮具有值时才进行验证,这表明该表单是用户提交的表单。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM