【问题标题】:Get user created list in Flask在 Flask 中获取用户创建的列表
【发布时间】:2018-04-08 16:56:55
【问题描述】:

我的目标是让用户在文本框中输入一个项目,单击“添加”并将该项目添加到列表中。用户应输入 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()

主要问题在于我的“content = request.form['itemlist']”行。单击提交按钮时,我似乎找不到将列表从 html 传递到 python 的好方法。我以后的目标是为用户创建的列表中的项目抓取特定的网站。

【问题讨论】:

  • 运行print(content)的结果是什么?
  • 我收到错误请求错误。我也尝试过使用 request.form.get('itemlist'),但这只是返回 None。

标签: javascript python jquery html flask


【解决方案1】:

这是因为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)

但是这不起作用,因为它只会打印项目列表中的最后一项。因为在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>

【讨论】:

  • 是的,我遇到了同样的问题,只能获得最后一项。不过,TextAreaForm 会很好用!
  • 有没有办法在不使用 jQuery 的情况下追加它?假设我希望用户能够直接在 TextAreaForm 中输入项目(就像现在一样),或者在单独的文本框中输入不同的值,该文本框将通过 python 函数传递,然后将新值附加到 TextAreaForm 中。如果有帮助,我可以尝试编写一些 sudo 代码。
  • @LoganKelly 不幸的是,我不是 jQuery 专家。不过我用了很多 Flask。我玩了几件事,不幸的是无法找到可行的方法。也许您可以完全删除 Flask 表单并构建一个 HTML 表单?考虑到TextForm 的行为方式不是我们喜欢的,这可能是您的解决方案。有一个form.getlist 函数可能很有用
猜你喜欢
  • 2020-09-08
  • 1970-01-01
  • 1970-01-01
  • 2014-02-02
  • 1970-01-01
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多