简体   繁体   中英

wtforms SelectField with dynamic choices always returns “none” for data

I am new to wtforms. I have to provide user with list of fruits and cost of each fruit as shown below,

截图

Total number of fruits are dynamically generated and each fruit prices is also dynamically generated.

Below is my declaration,

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 = [],
            )

Template contains the below code:

{% 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 %}

Before rendering the template, fruits_labels is dynamically populated with choices and form.fruits_list is dynamically populated with the lists, each list having choices.

User can select any particular fruit with a price, and remaining all other select inputs will be optional and then he can submit the form. After submitting the form, fruits_labels is dynamically populated with choices and form.fruits_list is dynamically populated with the lists, each list having choices (before validating) as shown below.

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.

Below is the output:

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

Even though I have selected a fruit3 with value 30, I don't know why the selected value is displayed as none. Also I tried displaying all the choices before retrieving the selected value, it displayed all the choices correctly. Several times I changed the code, but it always displays "none" value. Could someone please let me know what may be the issue.

It would be really helpful if you can provide me some example. Thanks for your time and help.

I resolved the issue!

After user submits the form, I am receiving the submitted values properly, but in populate_fruits_list() method, I am making the list empty by removing the elements from the list, using pop_entry(). Once the list is empty, I am adding the elements to the list again. Because of the deletion of list elements, user selection to this field is resetting to "None".

Solution: After the form was submitted, if there are any fields which are populated dynamically, we shouldn't delete the entries from the list instead we can reassign the values using index like arr[0] = value.

ie, replaced below statements

    arr.popentry()
    arr.append(value)

with

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

Hope this information will be helpful to others.

- Sravan

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM