简体   繁体   English

具有动态选择的wtforms SelectField始终为数据返回“无”

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

I am new to wtforms. 我是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. 在呈现模板之前,fruits_labels会动态填充选项,而form.fruits_list会动态填充列表,每个列表都有选项。

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. 提交表单后,fruits_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.

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. 即使我选择了值30的fruit3,我也不知道为什么所选值显示为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(). 用户提交表单后,我可以正确接收提交的值,但是在populate_fruits_list()方法中,我可以通过使用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. 解决方案:提交表单后,如果有任何字段是动态填充的,我们不应该从列表中删除条目,而是可以使用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 -Sravan

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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