【问题标题】:Getting "Not a valid choice" with wtforms select field in Flask app, what am I doing wrong?在 Flask 应用程序中使用 wtforms 选择字段获取“不是有效的选择”,我做错了什么?
【发布时间】:2015-10-19 01:36:46
【问题描述】:

所有。我正在开发一个 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'))

功能很好。该网站按我想要的方式工作,只是出于某种原因,我收到了“不是有效选择”的错误。这仅在我使用删除项目或清除购物车按钮之一时出现。

【问题讨论】:

  • 查看函数,还是单个函数?如果您在一个视图下获得了所有代码,那么单击其他表单上的按钮将使order_typevalidate_on_submit() 函数失败,这会给您提供您所看到的错误。将它们拆分为不同的视图,或检测正在提交的表单并处理该表单的逻辑。
  • 感谢您的浏览。我认为这将解决它。我明天会调查这个。如果你愿意,你可以写一个答案。
  • 我已经在使用this method 来识别不同的提交按钮。正如我所说,该功能工作得很好。每次我单击其中一个按钮时,它都会执行我想要的任务而不会出现任何错误。但我得到“不是一个有效的选择”。所以问题依然存在。

标签: python flask wtforms flask-wtforms


【解决方案1】:

我认为问题在于这一行:

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

在这里您无条件地验证OrderType 表单,因此,任何时候您单击其他按钮,由于选择下拉菜单没有值,此表单的验证都会失败。

尝试将条件的两个部分颠倒过来,如下:

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

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

【讨论】:

    猜你喜欢
    • 2012-12-07
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 2020-02-27
    • 2020-05-02
    • 2013-04-02
    • 1970-01-01
    • 2020-06-03
    相关资源
    最近更新 更多