我正在尝试使用 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
我有一种感觉,这种情况只需要稍微调整一下算法背后的逻辑,但我无法理解它。有人能指出我正确的方向吗?
我相信您的问题是您使用
request.form.get(...)
仅根据字段名称来查找字段。当多个字段具有相同值时,这不起作用。您需要找到一种方法使每个字段都唯一,以便您可以找到单个字段并仅编辑该字段。我建议将书的 id 添加到每个字段,如下所示。
<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
基本上,我们只是向每个字段添加一个唯一标识符,以便您可以找到正确的字段进行编辑。