我的目标是让用户在项目框中输入项目,点击"添加"并将该项添加到列表中。用户应输入X项目数量,然后单击“提交”。然后我想用python来操作那个项目列表。
这是我的HTML模板的样子:
<!DOCTYPE html>
<html>
<head>
<title> Foo </title>
</head>
<body>
<form action="" method="post">
<div class="input text" id = "items">
{{ form.item.label }} {{form.item}}
</div>
<input type="button" id="btnAdd" value="Add" onclick="addItem()">
<ul id = "itemlist" name = "itemlist">
</ul>
<script>
function addItem(){
var ul = document.getElementById("itemlist");
var li = document.createElement("li")
var children = ul.children.length + 1
li.setAttribute("id", "item"+children)
var input = item.value;
li.appendChild(document.createTextNode(input));
ul.appendChild(li)
}
</script>
<div class="input submit">
<input type="submit" value="Submit" />
</div>
</form>
</body>
</html>
这就是我目前的Python脚本:
from flask import Flask, render_template, flash, request
from wtforms import Form, TextField, TextAreaField, validators, StringField, SubmitField
from bs4 import BeautifulSoup
import requests
DEBUG = True
app = Flask(__name__)
app.config.from_object(__name__)
class ReusableForm(Form):
item = TextField('Item:', validators=[validators.required()])
@app.route("/", methods=['GET', 'POST'])
def foo():
form = ReusableForm(request.form)
if request.method == 'POST':
content = request.form['itemlist']
print(content)
return render_template('index.html', form=form)
if __name__ == "__main__":
app.run()
主要问题在于我的&#34; content = request.form [&#39; itemlist&#39;]&#34;线。当单击“提交”按钮时,我似乎无法找到将列表从html传递到python的好方法。我后来的目标是为用户创建的列表中的项目抓取特定网站。
答案 0 :(得分:0)
这是因为flask
表单有item
但不是itemlist
,因此它无法识别您的请求。你可以这样做:
@app.route("/", methods=['GET', 'POST'])
def foo():
form = ReusableForm(request.form)
if request.method == 'POST':
content = request.form['item']
print(content)
return render_template('index.html', form=form)
HOWEVER 这不起作用,因为它只会打印项目列表中的最后一项。因为输入flask
表单的最后一件事是item
列表中的最后一项。不幸的是,我无法找到解决这个确切问题的方法,因为有时烧瓶形式有一些奇怪的不良行为。但是,TextAreaForm
如果您想要使用它,则会完成与您打算做的完全相同的事情:
from flask import Flask, render_template, flash, request
from wtforms import Form, TextField, TextAreaField, validators, StringField, SubmitField
from bs4 import BeautifulSoup
import requests
DEBUG = True
app = Flask(__name__)
app.config.from_object(__name__)
class ReusableForm(Form):
items = TextAreaField('Item:', validators=[validators.required()])
@app.route("/", methods=['GET', 'POST'])
def foo():
form = ReusableForm()
if request.method == 'POST':
items = [x.strip() for x in request.form["items"].split("\r\n") if x != '']
print(items)
return render_template('index.html', form=form)
if __name__ == "__main__":
app.run()
使用以下HTML
<!DOCTYPE html>
<html>
<head>
<title> Foo </title>
</head>
<style>
label.textarea-label { vertical-align: top; }
</style>
<body>
<form action="" method="post">
<label id="items" class="textarea-label">Items:</label>
{{ form.items(placeholder="Items", rows=8) }}
{% for error in form.items.errors %}
<span style="color: red;">[{{ error }}]</span>
{% endfor %}<br>
<div class="input submit">
<input type="submit" value="Submit" />
</div>
</form>
</body>
</html>