Flask+WTForms+选择多字段和动态选择

2024-09-20 23:03:24 发布

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

我试图使用WTForms.SelectMultipleField来管理表单上的一些动态选择,但在提交验证之前,在客户端对其进行修改时遇到了一些困难。

基本上我有两个SelectMultipleField选项:

class MyForm(Form):
    assigned = SelectMultipleField('Assigned', choices=[])
    available = SelectMultipleField('Available', choices=[('1','1'),('2','2')])

我用烧瓶渲染Jinja2模板,就像这样:

@app.view("/myview", methods=['GET','POST'])
def myview():
    form = MyForm(request.form)
    if request.method == 'POST' and form.validate():
        return render_template("success.html")
    else:
        return render_template("index.html", form=form)

在我的模板中,我有:

<script type="text/javascript">
    function assign_object() {
        return !$('#available option:selected').remove().appendTo('#assigned');
    };

    function unassign_object() {
        return !$('#assigned option:selected').remove().appendTo('#available');
    }

    $(document).ready( function() {
        $('#available').dblclick( assign_object );
        $('#assigned').dblclick( unassign_object );
    });
</script>

<form action="/myview" method="post" name="assign_objects">
    {{ render_field(form.a) }}
    {{ render_field(form.b) }}
    <input type="submit" value="Assign" name="assign_button"/>
</form>

基本上所有这些都按预期工作;双击未分配列表中的某个项目会将其移到已分配列表中。问题是在提交表单进行验证时,因为“assigned”字段上的.choices属性最初是“[%”,预期仍然是“[%”,而不是我们提供的新选项列表。

有人知道怎么做吗?我想我可以重写forms pre_validate()函数并更新assigned.choices以包含“可用”列表中的所有值,但这感觉不太“正确”,可以用于在提交时从客户端提交随机值。

干杯, 大卫。


Tags: form客户端表单列表returnobject选项function
1条回答
网友
1楼 · 发布于 2024-09-20 23:03:24

POST请求中更新choices

AVAILABLE_CHOICES = [('1','1'),('2','2')]
DEFAULT_CHOICES = []

class MyForm(Form):
    assigned = SelectMultipleField('Assigned', choices=DEFAULT_CHOICES)
    available = SelectMultipleField('Available', choices=AVAILABLE_CHOICES)

@app.view("/myview", methods=['GET','POST'])
def myview():
    form = MyForm(request.form)
    if request.method == 'POST':
        form.assigned.choices = AVAILABLE_CHOICES
        if form.validate():
            return render_template("success.html")
        else:
            form.assigned.choices = DEFAULT_CHOICES

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

相关问题 更多 >

    热门问题