我有一个仪表板,用户可以在其中从可用电影类型列表中进行选择。他们还可以选择电影播放时间。查看控制台时,看起来这些值正在“发布”到我的应用程序。但是,正在发送“复选框”,其中键是个人姓名,值为“on”。我想做的就是让他们在值是名称的地方发布。从那里我想使用电影类型以及运行时作为单独 PL/SQL 过程的绑定参数(此处未显示/尚未完成)。但是,我在这里找不到解决方案。我认为问题的一部分是我正在使用 Jinja 模板将这些值动态传递到 index.html 页面。
这里有人有什么建议吗?
你好.py
from flask import Flask, redirect, render_template, url_for, request, Response
from flask_bootstrap import Bootstrap
import requests
import jinja2
from flask_wtf import FlaskForm
app = Flask(__name__)
@app.route('/')
def index():
response = requests.get('https://[my_ORDS_endpoint].adb.us-ashburn-1.oraclecloudapps.com/ords/admin/mymovies/genres')
# print(response.text)
genrelist = []
for i in response.json()["items"]:
genre = i['genre']
genrelist.append(genre)
return render_template('index.html', genrelist=genrelist)
@app.route('/handle_data', methods=['GET', 'POST'])
def handle_data():
if request.method == 'POST':
data = request.form.to_dict('name')
print(data)
return redirect("/")
if __name__ == "__main__":
app.run(host='0.0.0.0', debug=True)
index.html
<body class="p-3 m-0 border-0 bd-example m-0 border-0 bd-example-row">
<div class="container text-center">
<div class="row row-cols-3">
<div class="col">
<form action="{{ url_for('handle_data')}}" method="POST">
{% for genre in genrelist %}
<input type="checkbox" class="btn-check" id="{{ genre }}" name = "{{ genre }}" autocomplete="off">
<label class="btn btn-primary" for="{{ genre }}">"{{ genre }}"</label>
{% endfor %}
<label for="customRange3" class="form-label">Example range</label>
<input type="range" class="form-range" min="1" max="4" step="0.5" id="customRange3" name="customRange3">
<input type="submit">
</form>
</div>
<div class="col">Column</div>
</div>
</div>
<div class="container">
</div>
</body>
我已经为此工作了大约三天。我浏览了 Jinja2 文档,Flask。我观看了几个小时的 YouTube 视频,试图找到这个确切的用例。我也研究过 O-Reilly 的书。我找不到任何可以解释或说明这个问题的内容。
您似乎想以发送复选框值(即流派名称)的方式处理表单数据,而不仅仅是指示它们是否被选中。这可以通过修改 HTML 表单以及在 Flask 路由中处理数据的方式来完成。
这是一个可能的逐步解决方案:
第 1 步:修改 HTML 表单
更改复选框,使其值为流派名称:
<body class="p-3 m-0 border-0 bd-example m-0 border-0 bd-example-row">
<div class="container text-center">
<div class="row row-cols-3">
<div class="col">
<form action="{{ url_for('handle_data')}}" method="POST">
{% for genre in genrelist %}
<input type="checkbox" class="btn-check" id="{{ genre }}" name="genres" value="{{ genre }}" autocomplete="off">
<label class="btn btn-primary" for="{{ genre }}">"{{ genre }}"</label>
{% endfor %}
<label for="customRange3" class="form-label">Example range</label>
<input type="range" class="form-range" min="1" max="4" step="0.5" id="customRange3" name="runtime">
<input type="submit">
</form>
</div>
<div class="col">Column</div>
</div>
</div>
<div class="container">
</div>
</body>
在此修改中:
第2步:在Flask中处理表单数据
更新 Flask 路由来处理复选框并收集所选的流派名称:
@app.route('/handle_data', methods=['GET', 'POST'])
def handle_data():
if request.method == 'POST':
selected_genres = request.form.getlist('genres')
runtime = request.form.get('runtime')
data = {
'selected_genres': selected_genres,
'runtime': runtime
}
print(data)
# You can now use `selected_genres` and `runtime` for your PL/SQL procedure
return redirect("/")
在此修改中:
request.form.getlist('genres')
收集选中复选框的所有值(流派名称)。request.form.get('runtime')
收集运行时值。有了这些变化: