【问题标题】:Unable to get value selected in python from a dropdown using Flask无法使用 Flask 从下拉列表中获取在 python 中选择的值
【发布时间】:2018-04-03 10:53:38
【问题描述】:

这个问题可能是重复的,但我已经检查了此类相关问题的所有答案,但我无法解决。

我正在尝试从包含数字的下拉菜单中获取值。然后我想将数字与一个值进行比较,并根据比较显示一个文本。

例如

if value_selected_from_dropdown >3
 display text

我无法让文本显示甚至打印所选选项的值。

这里是python文件,web_plants.py

from flask import Flask, render_template,request, redirect, url_for

app = Flask(__name__)

def template(title = "HELLO!", text = ""):
    templateDate = {
        'text' : text
        }
    return templateDate

@app.route("/threshold", methods=['POST'])
def threshold():
        tvalue= (request.form.get['tvalue']) #get value from dropdown
        msg= ""
        if tvalue>3:
          msg= "rating above 3"
         templateData = template(text = msg) #display text using template()
        #templateData = template(text = tvalue) #tried to print the value selected
        return render_template('index.html', **templateData)

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=80, debug=True)

index.html:

<!DOCTYPE HTML>
<html>

<head>
 <link rel="stylesheet" type="text/css" href="{{ url_for('static',filename='style.css')}}" />
</head>

<body>

 <h2> {{ text }} </h2>
<form action= "{{ url_for('threshold') }}" method="post>"
             <p>
             <select name= 'tvalue'>
                 <option value="10">10</option>
                 <option value="11">11</option>
                 <option value="15">15</option>
                 <option value="2">2</option>
                 <option value="1">1</option>
              </select>
              </p>
    </form>
 </body>
</html>

【问题讨论】:

  • method="post&gt;" 是一个错字。应该是method="post"&gt;
  • @noslenkwah 感谢您指出这一点。

标签: python html flask


【解决方案1】:

有几种方法可以实现这一点。您可以为模板本身提供逻辑,也可以在function threshold 中添加逻辑。

index.html

<h2> {{text}} </h2>
<form action= "{{ url_for('threshold') }}" method="POST">

     <select name= 'tvalue'>
      {% for tvalue in tvalues %}
        {% if selected_tvalue == tvalue %}
            <option value="{{ tvalue }}" selected='selected'>{{ tvalue }}</option>
        {% else %}
             <option value="{{ tvalue }}" >{{ tvalue }}</option>
        {% endif %}
      {% endfor %}

      </select>

     <input type="submit" value="Submit" />
</form>

或,

{% if selected_tvalue > 3 %}
    <h2> Selected value is greater than 3 </h2>
{% else %}
     <h2> Selected value is less than or equal to 3 </h2>
{% endif %}   
<form action= "{{ url_for('threshold') }}" method="POST">

     <select name= 'tvalue'>
      {% for tvalue in tvalues %}
        {% if selected_tvalue == tvalue %}
            <option value="{{ tvalue }}" selected='selected'>{{ tvalue }}</option>
        {% else %}
             <option value="{{ tvalue }}" >{{ tvalue }}</option>
        {% endif %}
      {% endfor %}

      </select>
    <input type="submit" value="Submit" />
</form>

server.py

def template(title = "HELLO!", text = ""):
    templateDate = {
        'text' : text,
        'tvalues' : getTValues(),
        'selected_tvalue' : -1
    }
    return templateDate

def getTValues():
    return (10, 11, 15, 2, 1) 

@app.route("/threshold", methods=['POST', 'GET'])
def threshold():
    tvalue= -1 #default value
    msg = ''
    if request.method == "POST":            
        tvalue = int(request.form['tvalue'])
        if tvalue> 3:
            msg= "rating above 3"

    #generating template data
    templateData = template(text = msg)
    templateData['selected_tvalue'] = tvalue 

    return render_template('index.html', **templateData)

然后通过路径/threshold 访问您的表单。希望对你有帮助。

【讨论】:

  • 感谢您帮助我在与 IoT 和 Raspberry Pi 相关的最后一年项目中实现了一项重要功能。我发布的代码仅提供了一种基本且“简化”的方法,用于获取阈值以与我获得的传感器值进行比较(未添加到我发布的代码中)。根据比较(if tvalue&gt; 3:),灯泡将打开和关闭。非常感谢您花时间写答案:)
  • 您好,我需要让这个函数作为后台任务运行,这样当用户单击Submit 按钮时,if 运算符会不断检查该值。你能帮忙吗?因为当我试图通过某些方式让它工作时,我得到了working outside of request context
  • 我在这里发布了一个问题:stackoverflow.com/questions/49688824/…
【解决方案2】:

在您的下拉块之后的 html 中,您可能需要类似

 <input type="submit">

这将触发提交。我不确定,单独选择一个值会触发表单提交。

顺便问一下,您最初在哪里渲染您的页面?我会有类似的东西:

@app.route('/')
@app.route('/index')
def index():
    return render_template('index.html')

在python代码中。为了获得价值,我会尝试

tvalue= request.args.get('tvalue')

好吧,不是“form”而是“args”,以及普通括号而不是方括号。最后,您要处理“templateData”的函数也可能丢失。

最后一点: 你可能也需要 GET 方法:

@app.route("/threshold", methods=['GET', 'POST'])

【讨论】:

  • 我最初在 index.html 中渲染它。我只是在我发布的代码中省略了那部分
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多