Колба + 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 ответ:
Обновление
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)