首页 > 解决方案 > 封闭的 WTForms 中的 SelectField 在提交时丢失了他们的选择选项

问题描述

我已经尝试解决这个问题好几天了,但没有成功,所以希望有人能指出我正确的方向。

我正在做一个相当大的 Flask 项目,但创建了一个简单的项目来展示我的挑战:

#run.py

from flask import Flask, render_template
from flask_wtf import FlaskForm
from wtforms import StringField, FormField, FieldList, IntegerField, Form, SelectField
#from wtforms.fields.core import SelectField
from wtforms.validators import Optional

app = Flask(__name__)
app.config['SECRET_KEY'] = 'keepthissecret'

class ProductForm(Form):
    title = StringField('Title')
    price = IntegerField('Price', validators=[Optional()])
    optionsList1 = SelectField('Option1',choices=[('0','No'),('1','Yes'),('2','Maybe')])

class InventoryForm(FlaskForm):
    category_name = StringField('Category Name')
    products = FieldList(FormField(ProductForm), min_entries=1, max_entries=8)

@app.route('/', methods=['GET', 'POST'])
def index():

    form = InventoryForm()

    newProduct = ProductForm()
    newProduct.title = 'Product 1'
    newProduct.price = 10

    form.products.append_entry(newProduct)

    for prod in form.products:
        prod.optionsList1.choices = [('8','No'),('9','Yes'),('10','Maybe')]

    return render_template('index.html', form=form)


if __name__ == '__main__':
    app.run(debug=True)


#index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>FieldList Example</title>
</head>
<body>
    <form method="POST" action="">
        {{ form.hidden_tag() }}
        {{ form.category_name.label }} {{ form.category_name }}
        <br />
        
            {% for product in form.products %}
            <br/>
            {{ product.title }} {{ product.price }} {{ product.optionsList }} {{ product.optionsList1 }}
            {% endfor %}
        <button>Submit</button>
    </form>
</body>
</html>

这里的想法是我有一个包含产品列表的 InventoryForm 实例,每个元素都是代表 ProductForm 的 FormField。每个 ProductForm 上都有一个 SelectField,其中包含三个可能的选项,表示为一个元组列表。

当它启动烧瓶项目并第一次加载表单时,产品元素列表包含 2 个条目,一个是在实例化表单时创建的 (min_entries=1),另一个是我在实例化表单后添加的。

然后我要做的是遍历每个产品条目,并以编程方式将包含选项条目的元组更改为与表单定义中包含的默认选项不同的内容。我可以确认,当页面第一次加载时,表单包含 2 个元素,两个元素的选项都定义为 [('8','No'),('9','Yes'),('10' ,'也许')],就像我预期的那样。

问题是当我对这些字段进行选择并按下提交按钮时,根据我选择的内容,我在表单对象中拥有的数据值是正确的,但是列表中两个封闭表单的选择属性然后重置回到默认的 [('0','No'),('1','Yes'),('2','Maybe')]。因此,您最终会得到数据元素可能是“9”但选择是“0”、“1”或“2”的表单对象。

非常欢迎任何有助于理解我可能做错了什么的帮助。

提前谢谢了!

标签: pythonflaskflask-wtforms

解决方案


推荐阅读