你没有展示你如何使用
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
的价值。
为了将来的参考,我对 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.