提问人:Sanmaro 提问时间:11/14/2023 更新时间:11/15/2023 访问量:43
允许用户使用 Flask 更新动态表中的任意数量的行
Let user update any number of rows in a dynamic table using Flask
问:
我正在尝试使用 Flask/Python + SQLite 后端和 HTML/CSS/JS 前端 (Bootstrap) 编写一个由数据库驱动的 Web 应用程序。在一个部分中,用户应该能够一次更改任意数量的字段 - 除了禁用的字段 - 在动态生成的表格中显示书籍项目,即书名,作者,出版商等。
网络代码如下(我只发布生成器部分,表格确实是完整的,并包含在提交数据的标签中,没有问题):form
<tr>
<td class="fw-bold number"></td>
<td class="fst-italic">
<input class="form-control" type="text" name="title.{{ book['title'] }}" value='{{ book["title"] }}'>
</td>
<td class="table-active">{{ book["translator"] }}</td>
<td>
<input class="form-control" type="text" name="author.{{ book['author'] }}" value='{{ book["author"] }}'>
</td>
<td>
<input class="form-control" type="text" name="publisher.{{ book['publisher'] }}" value='{{ book["publisher"] }}'>
</td>
<td>
<input class="form-control" type="text" name="year.{{ book['published'] }}" value='{{ book["published"] }}'>
</td>
<td>
<input class="form-control" type="text" name="pages.{{ book['pages'] }}" value='{{ book["pages"] }}'>
</td>
</tr>
到目前为止,我只设法通过两种解决方案获得了一半。使用一个包罗万象的循环,我的脚本更改了相同值的所有实例,而不仅仅是所需的实例。但是,使用单独的循环和中断,用户无法再一次性更新同一类别的多个字段。for
我读过很多其他问题并在互联网上搜索过,但似乎我的问题很具体。或者我没有使用正确的关键字......
Python 代码(同样,只是显示两列示例中第二个解决方案的片段。该函数的其余部分似乎工作正常,在模板中呈现出的“坏”数据正常。另外,没关系闪光灯,无论如何它们都会以不同的方式完成。
my_books = db.execute("SELECT * FROM books_test")
if request.method == "POST":
for book in my_books:
# Get book ID
book_id = book["id"]
# Check new titles
old_title = book["title"]
new_title = request.form.get(f"title.{old_title}")
if new_title != old_title:
db.execute("UPDATE books_test SET title=? WHERE id=?", new_title, book_id)
flash("Titul knih/y byl změněn.")
break
for book in my_books:
# Get book ID
book_id = book["id"]
# Check new authors
old_author = book["author"]
new_author = request.form.get(f"author.{old_author}")
if new_author != old_author:
db.execute("UPDATE books_test SET author=? WHERE id=?", new_author, book_id)
flash("Autor knih/y byl změněn.")
break
我有一种感觉,这个案例只需要稍微调整一下算法背后的逻辑,但我无法理解它。有人能为我指出正确的方向吗?
答:
0赞
Patrick Yoder
11/15/2023
#1
我相信你的问题是你习惯于仅仅根据字段的名称来查找字段。当多个字段具有相同的值时,这不起作用。您需要找到一种方法来使每个字段都具有唯一性,以便您可以找到单个字段并仅编辑该字段。我建议将书的 id 添加到每个字段,如下所示。request.form.get(...)
<input class="..." type="text" name="title.{{ book['title'] }}.{{ book['id'] }}" value='{{ book["title"] }}'>
然后,这将允许您使用以下位找到要编辑的确切输入:
for book in my_books:
# Get book ID
book_id = book["id"]
# Check new titles
old_title = book["title"]
new_title = request.form.get(f"title.{old_title}.{book_id}")
if new_title != old_title:
db.execute("UPDATE books_test SET title=? WHERE id=?", new_title, book_id)
flash("Titul knih/y byl změněn.")
break
基本上,我们只是为每个字段添加一个唯一标识符,以便您可以找到正确的标识符进行编辑。
评论
1赞
Sanmaro
11/16/2023
谢谢你,帕特里克。这也正是我昨天意识到的问题的答案。我把你的回复打勾为正确的回复,供其他任何可能在更复杂的设置中为简单概念(以某种方式区分数据输入字段)而苦苦挣扎的人看到。
评论