允许用户使用 Flask 更新动态表中的任意数量的行

Let user update any number of rows in a dynamic table using Flask

提问人:Sanmaro 提问时间:11/14/2023 更新时间:11/15/2023 访问量:43

问:

我正在尝试使用 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

我有一种感觉,这个案例只需要稍微调整一下算法背后的逻辑,但我无法理解它。有人能为我指出正确的方向吗?

python html sqlite 烧瓶 jinja2

评论

0赞 EAW 11/14/2023
您在进行一次更新后中断,因此不会更新其余行。删除 break 语句,它应该可以工作。
0赞 Sanmaro 11/14/2023
是的,我也认为当我删除中断时它应该可以工作。但是,它的行为使得相同值的每个字段(例如,几本书的作者姓名)都会发生变化。奇怪的是,我只能在第一次出现此类值时进行此类更改。在其他行上更改它没有任何作用。我想这是对问题所在所在的担忧,但我仍然迷茫。有什么想法吗?

答:

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
谢谢你,帕特里克。这也正是我昨天意识到的问题的答案。我把你的回复打勾为正确的回复,供其他任何可能在更复杂的设置中为简单概念(以某种方式区分数据输入字段)而苦苦挣扎的人看到。