簡體   English   中英

Flask + WTForms + SelectMultipleField和Dynamic Choices

[英]Flask + WTForms + SelectMultipleField and Dynamic Choices

我正在嘗試使用WTForms.SelectMultipleField來管理表單上的一些動態選擇但是我遇到了一些困難,它在被提交驗證之前被修改為客戶端。

基本上我有兩個SelectMultipleField選項:

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

我正在使用Flask渲染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>

基本上所有這些都按預期工作; 雙擊未分配列表中的項目會將其移動到指定的列表。 問題是提交表單進行驗證時,因為“已分配”字段上的.choices屬性最初為“[]”,但仍然是“[]”而不是我們給出的新選項列表。

有誰知道這樣做的好方法? 我想我可以覆蓋表單pre_validate()函數並更新assigned.choices以包含“可用”列表中的所有值,但這感覺不對“並且可以用來從客戶端提交隨機值 - 提交方面。

干杯,大衛。

更新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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM