Jinja2 复选框值在烧瓶形式中返回为“on”

问题描述 投票:0回答:1

我有一个仪表板,用户可以在其中从可用电影类型列表中进行选择。他们还可以选择电影播放时间。查看控制台时,看起来这些值正在“发布”到我的应用程序。但是,正在发送“复选框”,其中键是个人姓名,值为“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 的书。我找不到任何可以解释或说明这个问题的内容。

python flask jinja2 flask-wtforms
1个回答
0
投票

您似乎想以发送复选框值(即流派名称)的方式处理表单数据,而不仅仅是指示它们是否被选中。这可以通过修改 HTML 表单以及在 Flask 路由中处理数据的方式来完成。

这是一个可能的逐步解决方案:

  1. 修改 HTML 表单:更改复选框以发送其值(即流派名称)而不是“on”。
  2. 在 Flask 中处理表单数据:更新 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')
    收集运行时值。

有了这些变化:

  • 表单现在可以正确发送所选复选框的值(流派名称)。
  • Flask 路由处理这些值,您现在可以使用它们进行进一步处理,例如将它们绑定到 PL/SQL 过程。
© www.soinside.com 2019 - 2024. All rights reserved.