【问题标题】:How do I get my HTML button to delete the right list item from a SQLite database?如何让我的 HTML 按钮从 SQLite 数据库中删除正确的列表项?
【发布时间】:2012-05-11 13:18:36
【问题描述】:

我是初学者,所以请提前原谅任何愚蠢行为。我正在使用 Flask(以及扩展名 Jinja2)来创建一个简单的 Web 应用程序——它基本上可以让您将电影输入到 Web 表单中,然后将其添加到 SQLite 数据库中。我已经让 Flask 非常好地遍历数据库中的所有电影,并在加载时将它们打印到页面上。

我想在每部电影旁边添加一个“删除”按钮。让按钮出现很简单。但我不确定如何将按钮绑定回函数 delete_movie() 以便删除与按下的按钮关联的正确电影。

由于每部电影旁边都会有一个按钮,我猜表单元素必须是动态命名的。但如果它是动态命名的,我如何将正确的值传递回函数?这是我到目前为止所得到的:

#movies.html
<div class=page>
    <h1>Movie List</h1>
    <ul class=movies>
    {% for movie in movies %}
        <li><h1>{{ movie.title }}</h1>
        <form action="{{ url_for('delete_movie') }}" method=post class=delete-movie><input type=submit value=Delete name=movie_to_delete"></form>
    {% endfor %}
    </ul>
</div>

#app.py
@app.route('/delete', methods=['POST'])
def delete_movie():
    g.db.execute('delete from movies where movie = ?', [request.form['movie_to_delete']])
    g.db.commit()
    return redirect(url_for('list_movies'))

提前感谢您的帮助!

【问题讨论】:

    标签: python html forms flask jinja2


    【解决方案1】:

    只需在每个表单中添加一个隐藏输入,并使用要删除的元素 ID/名称作为值:)

    例如。

    <form action="{{ url_for('delete_movie') }}" method=post class=delete-movie>
      <input type=hidden value="{{ movie.name }}"name=movie_to_delete />
      <input type=submit />
    </form>
    

    【讨论】:

    • @Barrett 很高兴这对您有所帮助 :) 如果它解决了您的问题,请记住将答案标记为正确 :)
    • 完成。我是 Stack Overflow 和编码方面的初学者 ;)
    【解决方案2】:

    IMO,以上答案中的方法是完全没有必要的。您应该将电影的名称作为 URL 变量传递:

    {% for movie in movies %}
        <li><h1>{{ movie.title }}</h1>
        <form action="{{ url_for('delete_movie', movie_name=movie.name) }}" method=post>
            <input type=submit value=Delete">
        </form>
    {% endfor %}
    

    在视图函数中,将变量包含在URL规则中(即/delete/&lt;movie_name&gt;),然后你可以得到电影的名字作为参数:

    @app.route('/delete/<movie_name>', methods=['POST'])
    def delete_movie(movie_name):
        g.db.execute('delete from movies where movie = ?', [movie_name])
        ...
    

    但是,在这个用例中,人们通常传递电影记录的 id 值而不是名称。这是来自similar application 的一个最小示例:

    模板:

    <form method="post" action="{{ url_for('delete_movie', movie_id=movie.id) }}">
        <input class="btn" type="submit" name="delete" value="Delete">
    </form>
    

    查看:

    @app.route('/movie/delete/<int:movie_id>', methods=['POST'])
    @login_required
    def delete_movie(movie_id):
        movie = Movie.query.get_or_404(movie_id)
        db.session.delete(movie)
        db.session.commit()
        flash('Item deleted.')
        return redirect(url_for('index'))
    

    【讨论】:

    • 如果您想使用“DELETE”方法,HTML 是什么?@app.route('/delete/&lt;movie_name&gt;', methods=['DELETE']) 以下 HTML:`
      ...
      不起作用。谢谢
    • 您只能在 HTML 中使用 GET 或 POST。对于其他方法,您将需要使用 JavaScript 来发送请求。
    猜你喜欢
    • 1970-01-01
    • 2019-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 2020-01-16
    相关资源
    最近更新 更多