将下拉菜单的值传递到Flask模板

10 投票
2 回答
28712 浏览
提问于 2025-04-18 05:56

我在把从HTML下拉菜单中选中的项目传递给SQL查询时遇到了问题。

我不太确定我的代码缺少了什么概念,导致它无法正常工作。我找到的大多数例子都是用PHP写的,我不太知道怎么把它们转换成Python。

这是我的情况。我正在使用Flask和Sqlite,想让用户从HTML下拉菜单中选择一个项目。用户从下拉菜单中选择的项目将用于SQL查询,以从数据库中检索信息,然后在新页面上显示这些结果。

举个例子,用户从一个有三个选项(红色、蓝色、绿色)的下拉菜单中选择“红色”,然后点击提交按钮。“红色”将被传递到我app.py文件中的SQL查询中,这个查询会检索所有颜色为“红色”的数据。然后,这些检索到的数据会显示在/results.html页面上。

我认为我的问题在于,我没有正确地给下拉菜单中的项目赋值,然后把这个值传递给运行SQL查询的Python代码。我觉得应该是这样工作的,但我可能遗漏了一些更重要的东西。

我尝试了很多HTML代码来让它工作,但我甚至不确定问题出在哪里。当我点击“提交”时,我确实跳转到了新页面,但数据库中的内容没有显示出来。

这是我的代码,包括我的两个视图('/'和'results.html')以及我的Python代码:

@app.route('/results.html', methods=['GET','POST'])
def results():
    g.db = connect_db()

    cur = g.db.execute("SELECT * FROM all_items WHERE name = '{}'".format('Red'))
    posts = [dict(item=row[0], name=row[1]) for row in cur.fetchall()]
    g.db.close()
    return render_template('results.html', posts=posts)

这是包含下拉菜单的视图

<select name="Item_1">
    <option value="Red">Red</option>
    <option value="Green">Green</option>        
</select>

<form name="Item_1" action="results.html" method='POST'>
    <button type="submit">Compare!</button>
</form>

这是应该显示选择“红色”结果的视图

% extends "template.html" %}
{% block content %}
<h2>Results</h2>

{% for p in posts %}
    <strong>Item:</strong> {{ p.item }}
    <strong>Name:</strong> {{ p.name}}  
{% endfor %}
{% endblock %}

2 个回答

0

正如@dim提到的,把选择框放在表单里,然后可以通过 request.form['Item_1'] 来获取选中的值。不过因为这里查询的是一个选择框,我更倾向于使用GET而不是POST。从维基百科上来看,http://en.wikipedia.org/wiki/POST_(HTTP),POST是用来做什么的呢?

The POST request method is designed to request that a web server accept the data enclosed in the request message's body for storage.[1] It is often used when uploading a file or submitting a completed web form.

所以我更喜欢使用GET,这样可以用来查询数据库。当使用GET时,Item_1可以作为请求参数传递,并通过 flask.request.args 来获取。

9

你需要把你的 select 放在 form 里面。

<form name="Item_1" action="results.html" method='POST'>
    <select name="Item_1">
        <option value="Red">Red</option>
        <option value="Green">Green</option>        
    </select>
    <button type="submit">Compare!</button>
</form>

还有一种更好的方式来声明 form,那就是

<form name="Item_1" action="{{ url_for('results') }}" method="POST">

撰写回答