2015-03-18 4 views
1

Я новичок в wtforms. Я должен предоставить пользователю список фруктов и стоимости каждого плода, как показано ниже,wtforms SelectField с динамическим выбором всегда возвращает «none» для данных

screenshot

Общее количество плодов генерируются динамически и каждый фрукты цены также динамически.

Ниже мое заявление,

from flask.ext.wtf import Form 
class SelectForm(Form): 
    def __init__(self, csrf_enabled=False, *args, **kwargs): 
     super(SelectForm, self).__init__(csrf_enabled=csrf_enabled, *args, **kwargs) 
    fruits_list = wtforms.FieldList(
      wtforms.SelectField('fruits', 
       validators = [validators.Optional()] 
       ), 
      ) 
fruits_labels = wtforms.RadioField('Fruit', 
      choices = [], 
      ) 

Шаблон содержит следующий код:

{% for fruit in form.fruits_labels %} 
<tr> 
    <td> 
     {{fruit}} 
     {{fruit.label}} 
    </td> 
    <td> 
     {% set fruitslist = form.fruits_list[loop.index0] %} 
     {% if fruitslist.choices|length %} 
     {{fruitslist(class='form-control')}} 
     {% endif %} 
    </td> 
</tr> 
{% endfor %} 

Перед вынесением шаблона fruits_labels динамически заполняется выбор и form.fruits_list динамически заполняется со списками , каждый список имеет выбор.

Пользователь может выбрать любой конкретный плод по цене, а остальные остальные входы выбора будут необязательными, а затем он может отправить форму. После отправки формы, fruit_labels динамически заполняется вариантами, а form.fruits_list динамически заполняется списками, каждый из которых имеет выбор (перед проверкой), как показано ниже.

populate_fruits_list() #form.fruits_list is dynamically populated in this function 
if not form.validate_on_submit(): 
    return render_template('new.html', form=form) 

i=0 
while i<len(form.fruits_list): 
    print 'form.fruits_list choices[',i,']: ', form.fruits_list[i].data 
    i=i+1 

print 'selection: ', form.fruits_list[userselection].data # userselection is a variable that contains the index of the fruit user has selected. 

Ниже выход:

form.fruits_list choices[ 0 ]: [('0', '-select-'), (1, '1')] 
form.fruits_list choices[ 1 ]: [('0', '-select-'), (30, '30'), (17, '17'), (16, '16'), (15, '15'), (14, '14'), (7, '7'), (6, '6'), (5, '5'), (4, '4'), (3, '3'), (2, '2'), (1, '1')] 
form.fruits_list choices[ 2 ]: [('0', '-select-'), (30, '30'), (29, '29'), (28, '28'), (19, '19'), (18, '18'), (13, '13'), (3, '3'), (2, '2'), (1, '1')] 
form.fruits_list choices[ 3 ]: [('0', '-select-'), (30, '30'), (29, '29'), (28, '28'), (21, '21'), (20, '20'), (12, '12'), (11, '11'), (10, '10'), (2, '2'), (1, '1')] 
selection: None 

Даже если я выбрал fruit3 со значением 30, я не знаю, почему выбранное значение отображается как никто. Также я попытался отобразить все варианты перед извлечением выбранного значения, он отобразил все варианты правильно. Несколько раз я менял код, но он всегда отображает значение «none». Может кто-нибудь, пожалуйста, дайте мне знать, что может быть проблемой.

Было бы очень полезно, если вы можете предоставить мне пример. Спасибо за ваше время и помощь.

ответ

0

Я решил проблему!

После того как пользователь отправит форму, я получаю представленные значения правильно, но в методе populate_fruits_list() я делаю список пустым, удаляя элементы из списка, используя pop_entry(). Когда список пуст, я снова добавляю элементы в список. Из-за удаления элементов списка пользовательский выбор в это поле сбрасывается на «Нет».

Решение: после того, как форма была отправлена, если есть какие-либо поля, которые заполняются динамически, мы не должны удалять записи из списка, вместо этого мы можем переназначить значения с помощью индекса, например arr [0] = значение.

т.е. заменить ниже заявления

arr.popentry() 
    arr.append(value) 

с

arr[i] = value //where i is an index 

Надежда эта информация будет полезна другим.

- Sravan

Смежные вопросы