Flask/Python表单在Selectfield中选择Value后添加/删除字段

2024-09-27 21:35:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经用下面的代码动态创建了一个Flask-WTF表单。我尝试在从selectfield中选择某个值之后动态地执行此操作。也就是说,从第一个selectfield中选择一个值,从db中获取项目列表,然后创建代码中的字段,而不需要重新加载页面

应用程序:

class SpecificsForm(FlaskForm):
    itemSpecific_id = StringField('itemSpecific_id')
    itemSpecific = StringField(label='Item Specific', validators=[DataRequired()])


class ListingForm(FlaskForm):
    itemBrand = SelectField(label='Brand:', validators=[DataRequired()])
    itemSpecifics = FieldList(FormField(SpecificsForm))


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


    itemSpecifics = ['Style:', 'Type:', 'Width:', 'Height:']

    class LocalForm(ListingForm):
        pass

    totalFields = len(itemSpecifics)
    LocalForm.itemSpecifics = FieldList(FormField(SpecificsForm), min_entries=totalFields)
    listingForm = LocalForm()

    return render_template('index.html', listingForm=listingForm, itemSpecifics=itemSpecifics)

索引.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
    <body>
        <form action="" method="post" role="form">
            {{ listingForm.hidden_tag() }}
            <p>
                {{ listingForm.itemBrand.label }}
            </p>
            <p>
                {{ listingForm.itemBrand() }}
            </p>
            {% for l in listingForm.itemSpecifics %}
            <p>
            {{ itemSpecifics[loop.index0] }}
            </p>
            <p>
                {{ l.form.itemSpecific }}
            </p>
            {% endfor %}

            <input type="submit" value="Submit!" />
        </form>
    </body>
</html>

如果我在“render\u template”之前添加了下面的内容,则按submit按钮时,将添加额外的字段(颜色),而不清除现有值。用ajax从一个按钮发送post请求不会做同样的事情,为什么提交表单会导致页面“更新”

    if request.method == 'POST':

        itemSpecifics = ['Style:', 'Type:', 'Width:', 'Height:', 'Colour:']

        class LocalForm(ListingForm):
         pass

        totalFields = len(itemSpecifics)
        LocalForm.itemSpecifics = FieldList(FormField(SpecificsForm), min_entries=totalFields)
        listingForm = LocalForm()

我已经在论坛上搜寻了几天,寻找一个我能理解的足够简单的解决方案,但我发现了许多变化,只是不知道适合我的要求的最佳方法。我考虑过只隐藏额外的字段并按要求显示它们,但不确定如何知道哪个是哪个,因为所选项目之间的顺序并不总是相同的

希望这是有意义的,并提前感谢任何援助


Tags: formindexhtmllabelclassformfieldfieldlistlistingform

热门问题