我有一个非常简单的应用程序,它使用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中的函数如何将该数据作为输入参数
答案 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)