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

问题描述 投票:0回答:1

我正在尝试使用 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 flask jinja2
1个回答
0
投票

我相信您的问题是您使用

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

基本上,我们只是向每个字段添加一个唯一标识符,以便您可以找到正确的字段进行编辑。

© www.soinside.com 2019 - 2024. All rights reserved.