将数据作为列表从 HTML 模板发送到 Flask

问题描述 投票:0回答:2
python html flask jinja2
2个回答
1
投票

你没有展示你如何使用

getlist()

但经常出现的问题是人们使用
id
而不是
name


最少的工作代码:

我使用

getlist("categories")
因为我有
name="categories"

from flask import Flask, request, render_template_string

app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def index():
    print('args :', request.args)
    print('form :', request.form)
    print('json :', request.json)
    print('files:', request.files)
    print('data :', request.data)

    print('categories:', request.form.getlist("categories"))
    
    return render_template_string('''<!DOCTYPE html>
<html>
<body>

<form method="POST" enctype="multipart/form-data">
    <input type="text" name="title"><br/>

    <input type="file" name="file"><br/>

    <select name="categories" multiple id="blablabla">
        <option value="Comedy">Comedy</option>
        <option value="Tech">Tech</option>
        <option value="Art">Art</option>
        <option value="Classic">Classic</option>
        <option value="Nature">Nature</option>
    </select>

    <button type="submit">Publish</button>
</form>

</body>
</html>''')

if __name__ == '__main__':
    #app.debug = True 
    app.run()  

编辑:

我还添加了

id="blablabla"
(但我可以添加相同的
id="categories"
),但所有浏览器总是使用
name
将表单信息发送到服务器(因为浏览器是在90年代创建的)。

所有元素都应该有

name
-
<input>
<select>
<button>
<textarea>

如果元素没有
name
,则浏览器不会将其发送到服务器(并且
id
无法更改它)。
如果元素有
name
,那么浏览器会发送它,即使它是空的。
例外情况可以是
select
checkbox
,必须选择/检查它们才能发送值。

所有框架和语言都必须使用来自

name
的价值,而不是来自
id
的价值。


0
投票

为了将来的参考,我对 Furas 的答案做了一些小改动,以使

request.form.getlist()
的输出更加清晰。

from flask import Flask, request, render_template_string

app = Flask(__name__)

@app.route('/', methods=['GET', 'POST'])
def index():
   if request.method == "POST":
       print('form :', request.form)
       print('files:', request.files)
       print('data :', request.data)
       mylist = request.form.getlist("categories")
       print('categories: *** {} ***'.format(mylist))
       return mylist
   return render_template_string('''<!DOCTYPE html>
<html>
<body>
<meta charset="UTF-8">
<form method="POST" enctype="multipart/form-data">
    <input type="text" name="title"><br/>

    <input type="file" name="file"><br/>

    <select  name="categories" size=5 multiple id="xyz">
        <option value="1">One</option>
        <option value="2">Two</option>
        <option value="3">Three</option>
        <option value="4">Four</option>
        <option value="5">Five</option>
    </select>

    <button type="submit">Publish</button>
</form>

</body>
</html>''')

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

输出:

form : ImmutableMultiDict([('title', 'testing'), ('categories', '1'), ('categories', '2'), ('categories', '3'), ('categories', '4'), ('categories', '5')])
files: ImmutableMultiDict([('file', <FileStorage: 'my.csv' ('text/csv')>)])
data : b''
categories: *** ['1', '2', '3', '4', '5'] ***
192.168.0.74 - - [30/Aug/2024 20:58:17] "POST / HTTP/1.1" 200 -
``

This is done on a headless pi, so I needed `host='0.0.0.0` in `app.run`, otherwise suggest removing it.
© www.soinside.com 2019 - 2024. All rights reserved.