Колба + WTForms + SelectMultipleField и динамический выбор


Я пытаюсь использовать 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 в поле "assigned" изначально был "[] "и по-прежнему должен быть" []", а не новый список опций, который мы ему дали.

Кто-нибудь знает хороший способ сделать это? Я думал, что смогу переопределить функцию forms pre_validate () и обновить ее.выбор включить все значения из списка "доступно", но это не кажется "правильным" и может быть используется для отправки случайных значений со стороны клиента при отправке.

Ура!, Дэвид.

1 10

1 ответ:

Обновление 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)