Python Flask Sqlite3 Web App从数据库表行中删除

时间:2016-12-06 14:44:19

标签: python flask sqlite

我有一个非常简单的应用程序,它使用Python和Flask在sqlite3数据库中创建,删除和更新记录。我目前正在处理删除功能,并遇到了障碍。下面是我的视图代码,显示表中的记录:

<!doctype html>
<html>
   <body>

      <table border = 1>
         <thead>
            <td>Name</td>
            <td>Address>/td<
            <td>city</td>
            <td>Pincode</td>
         </thead>

         {% for row in rows %}
            <tr>
               <td>{{row["name"]}}</td>
               <td>{{row["addr"]}}</td>
               <td> {{ row["city"]}}</td>
               <td>{{row['pin']}}</td>
           <td><form action = "/foo" method = "POST">
           <button id ="w3-btn">delete</button>
        </form> </td>
            </tr>
         {% endfor %}
      </table>

      <a href = "/">Go back to home page</a>

   </body>
</html>

从代码中可以看出,我为每条显示的记录都有一个删除按钮。我怎样才能使用户点击任何给定行上的删除按钮,该行将从表中删除?我想知道如何指定所选行,以及如何将该信息/数据发送到app.py中的'foo',以及app.py中的函数如何将该数据作为输入参数

2 个答案:

答案 0 :(得分:2)

如果您有row["pin"]

然后您可以在method="POST"

的表单中使用隐藏字段
<form action="/foo" method="POST">
    <input type="hidden" value="{{ row["pin"] }}"/>
    <button id="w3-btn">delete</button>
</form>

或在网址

中使用method="GET"?id=some_id
<form action="/foo?id={{ row["pin"] }}" method="GET">
    <button id="w3-btn">delete</button>
</form>

或者甚至是normal link(您可以使用CSS设置为按钮的样式)

<a href="/foo?id={{ row["pin"] }}">delete</a>

在视图中你将有

 # POST

 @app.route('/foo', methods=['POST']) 
 def foo():
      pin = requests.form.get('id')
      print(pin)

 # GET or normal link

 @app.route('/foo') 
 def foo():
      pin = requests.args.get('id')
      print(pin)

阅读文档:http://flask.pocoo.org/docs/0.11/

如果您使用的网址不是?id=,而是"/foo/some_id"

action="/foo/{{ row["pin"] }}"

<a href="/foo/{{ row["pin"] }}">delete</a>

或使用url_for()

action="{{ url_for('foo', pin=row["pin"]) }}"

<a href="{{ url_for('foo', pin=row["pin"]) }}">TEST</a>

然后你需要

 @app.route('/foo/<pin>') 
 def foo(pin):
      print(pin)

答案 1 :(得分:1)

创建一个删除id的删除视图。

@app.route('/<int:id>/delete', methods=['POST'])
def delete(id):
    r = Record.query.get_or_404(id)
    db.session.delete(r)
    db.session.commit()
    return redirect(url_for('index'))

删除表格的操作是删除视图的生成网址。

<form method=post action="{{ url_for('delete', id=r.id) }}">

这假定每行都有一个id属性。例如:

from flask import Flask, redirect, url_for, render_template_string
from flask_sqlalchemy import SQLAlchemy

app = Flask(__name__)
db = SQLAlchemy(app)

class Item(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String)

db.create_all()
db.session.add_all((
    Item(name='abc'),
    Item(name='def'),
    Item(name='ghi'),
))
db.session.commit()

@app.route('/')
def index():
    items = Item.query.all()
    return render_template_string('''<ul>{% for item in items %}
        <li>{{ item.name }} -
        <form method=post action="{{ url_for('delete', id=item.id) }}">
            <button type=submit>delete</button>
        </form></li>
    {% endfor %}</ul>''', items=items)

@app.route('/<int:id>/delete')
def delete(id):
    item = Item.query.get_or_404(id)
    db.session.delete(id)
    db.session.commit()
    return redirect(url_for('index'))

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