【问题标题】:Python Flask Form - html Selectbox returning 'None' as the selected itemPython Flask 表单 - html 选择框返回“无”作为选定项
【发布时间】:2020-11-22 15:58:44
【问题描述】:

我正在使用 Flask 和 Python 创建一个网站服务器程序,我对 Flask 比较陌生。我创建了一个带有 Select 标记的 html 表单(下拉菜单,单选)。你可以看下面的代码。

selectmenu.html

<!doctype html>
<html>
<body>
    <form id="form" method="POST" class="selectform">
        <select method="GET" size=5>
            {% for x in options %}
            <option value="{{x}}" SELECTED>{{x}}</option>
            {% endfor %}
        </select>
        <input type="submit" name="go"></input>
    </form>
</body>
</html>

Flask 的 Python 代码: app.py

@app.route('/selectmenu',methods=(['GET','POST']))
def selmenu():
    optionfiles = os.listdir('options')
    form = selectform()
    if request.method == 'POST':
        selectedoption = form.selectedoption.data
        print(selectedoption)
        return redirect('/')
    return render_template('selectmenu.html',options=optionfiles,form=form)

最后是 Python WTForms 类代码forms.py

class selectform(FlaskForm):
    optionfiles = os.listdir('userdata')
    print(optionfiles)
    selectedoption = SelectField('selectdropdown', choices=optionfiles,validators=[DataRequired()])
    submitbutton = SubmitField('submit',validators=[DataRequired()])

但是当程序调用form.selectoption.data时,它每次都返回None

我尝试了很多教程和 Stackoverflow 的答案,但仍然无法从不是 None 的表单中获取数据。

注意:如您所知,我只上传了 sn-ps 代码,因为实际文件都大得多!如果您需要代码的任何其他位,例如:导入,那么请询问,但我很确定错误不是导入,例如!否则我会收到 ImportError。

提前感谢您的帮助!

【问题讨论】:

    标签: python html python-3.x flask drop-down-menu


    【解决方案1】:

    您似乎正在使用 Flask-WTF (FlaskForm),但您编写 html 部分的方式不符合它。 要确认您可以将selectmenu.html 替换为:

    <!doctype html>
    <html>
    <body>
        <form method="POST">
            {{ form.selectedoption() }}
            {{ form.csrf_token }}
            {{ form.submitbutton(class_='btn btn-primary') }}
        </form>
    </body>
    </html>
    

    如果是这种情况,您可以查看https://flask-wtf.readthedocs.io/en/stable/quickstart.htmlhttps://flask.palletsprojects.com/en/1.1.x/patterns/wtforms/#forms-in-templates(用于简单模板)。

    (并且return render_template('selectmenu.html',options=optionfiles,form=form)可以替换为return render_template('selectmenu.html',form=form)

    【讨论】:

    • 感谢您的回答 - 缩短方法真的很有帮助!但我很抱歉,在进行了更多的网络拖网搜索之后,我才找到了答案here。再次道歉并感谢您的回答。
    【解决方案2】:

    找到this Stackoverflow post后我找到了答案。

    我需要给&lt;select&gt; 标记一个名字,像这样:在html 文件中的name="optionsbox"。 然后在 app.py 文件中执行request.form.get("optionsbox"),而不是form.selectedoption.dataforms.py 文件无需更改。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-28
      • 2019-10-27
      • 2017-09-06
      • 1970-01-01
      • 1970-01-01
      • 2021-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多