Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/314.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从列表中动态选择字段,而不是从数据库中选择_Python_Flask_Dropdown_Flask Wtforms - Fatal编程技术网

Python 从列表中动态选择字段,而不是从数据库中选择

Python 从列表中动态选择字段,而不是从数据库中选择,python,flask,dropdown,flask-wtforms,Python,Flask,Dropdown,Flask Wtforms,我正在尝试使用WTForms创建一个动态下拉列表(SelectField)。我已经阅读了文档,并查看了堆栈上的许多答案,所有示例都涉及对db查询的迭代 我只想迭代一个列表(由外部API调用生成)来注入SelectField选项。例如: class ToolForm(FlaskForm): myField3 = SelectField(u'Select Account', choices=[], coerce=int) @app.route("/test", methods=['G

我正在尝试使用WTForms创建一个动态下拉列表(SelectField)。我已经阅读了文档,并查看了堆栈上的许多答案,所有示例都涉及对db查询的迭代

我只想迭代一个列表(由外部API调用生成)来注入SelectField选项。例如:

class ToolForm(FlaskForm):


    myField3 = SelectField(u'Select Account', choices=[], coerce=int)


@app.route("/test", methods=['GET', 'POST'])
def test():
    form = ToolForm()
    accounts5 = []

    if request.method == 'POST':
        if request.form['submit_button'] == 'Select Account':

            #code that generates list called "accounts5"

            acctchoices = [(c.id,c.name) for c in accounts5]
            form.myField3.choices = acctchoices

    return render_template('test.html', title='test', form=form, accounts5=accounts5)
我的相关HTML如下所示:

<div class="form-group">
    {{ form.myField3.label(class="form-control-label") }} {% if form.myField3.errors %} {{ 
    form.myField3(class="form-control form-control-lg is-invalid") }}
    <div class="invalid-feedback">
        {% for errors in form.myField3.errors %}
        <span>{{ error }}</span>
        {% endfor %}
    </div>
    {% else %} {{ form.myField3(class="form-control form-control-lg") }} {% endif %}
</div>
<form action="http://127.0.0.1:5000/test" method="post">


    <input type="submit" class="btn btn-outline-info" name="submit_button" value="Select Account">

</form>

{{form.myField3.label(class=“form control label”)}{%if form.myField3.errors%}{{
form.myField3(class=“form control form control lg is invalid”)}
{form.myField3.errors%}中的错误为%
{{error}}
{%endfor%}
{%else%}{{form.myField3(class=“form control form control lg”)}{%endif%}
当我单击“选择帐户”时,我得到一个
'int'对象没有属性“id”
错误。我认为这可能是一个数据类型问题,所以我尝试使用字符串列表,但没有效果


我的问题是,如何从列表中填充我的SelectField?

当您获得该路由时,它将加载一个通用表单并将其呈现到页面,而没有设置或提供任何
myField3
选项

您可以使用
\uuuu init\uuuu
覆盖,根据特定条件控制要加载的表单:

class ToolForm(FlaskForm):
    myField3 = SelectField(u'Select Account', choices=[], coerce=int)
    def __init__(self, accounts=None):
        super().__init__()  # calls the base initialisation and then...
        if accounts: 
            self.myField3.choices = [(c.id, c.name) for c in accounts]
然后,您将根据路由请求从其他信息构建表单:

   @app.route("/test", methods=['GET', 'POST'])
   def test():
       # define accounts
       form = ToolForm(accounts=accounts)     

accounts5看起来像什么?你确定它带有“id”和“name”可以访问吗?@Till Accounts5看起来像一个普通的列表,我现在意识到这是一个疏忽。我试着用元组构建一个列表,比如
accounts5=[(“test”、“1”)、(“tested”、“3”)、(“testing”、“3”)]
,但是得到的
“tuple”对象没有属性“id”
Ok,在这个列表中,您已经切换了SelectField的id和名称。为什么不先简化逻辑,让SelectField正常工作呢?如果您设置
accounts5=[('1','test'),('3','tested'),('4','testing')]
form.myField3.choices=accounts5
,则它将起作用。您正在显示的列表没有主键的“id”或“name”属性(但您从中获取示例的数据库对象有)。这是一个有趣的答案,给了我一些新的想法,但我仍然得到相同的错误,
'int'对象没有属性'id
,当我将其更改为元组时,我得到了@Till所说的
'tuple'对象没有属性'id
,只需使用
self.myField.choices=accounts
。只有
可以使用
识别属性。与
c.id
类似,否则可以按索引对元组进行索引,即
c[0]
c[1]
。此错误与另一个问题有关,即您没有根据希望填充选项的方式正确定义
帐户。