11

WTForms.SelectMultipleField を使用してフォームのいくつかの動的な選択肢を管理しようとしていますが、検証のために送信される前にクライアント側で変更されるという問題に直面しています。

基本的に、2 つの 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 を更新して「利用可能な」リストのすべての値を含めることができると考えていましたが、これは「正しい」とは感じられず、クライアントからランダムな値を送信するために使用できます-提出する側。

乾杯、デビッド。

4

1 に答える 1

12

リクエストchoicesの更新:POST

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)
于 2012-10-22T22:01:03.920 に答える