python 表单不会编辑数据库条目,我不完全确定我在做什么

np8igboo  于 2023-03-16  发布在  Python
关注(0)|答案(1)|浏览(162)

所以我用mongoDB、flask和Python做了一个小型的个人图书馆应用程序,你可以在上面输入你的书的条目,并把它们保存在一个类似账户/登录的地方。问题是,我不能让表单本身ping这个函数来编辑东西。我知道我的目标是错误的,但我觉得我需要有人像我五岁时一样解释我哪里出错了。
这就是函数:

@app.route("/profile/<username>", methods=["GET", "POST"])
def edit_book(book_id, username):
    if request.method == "POST":
        submit = {
            "category_name": request.form.get("category_name"),
            "title": request.form.get("title"),
            "author": request.form.get("author"),
            "genre": request.form.get("genre"),
            "rating": request.form.get("rating"),
            "release_date": request.form.get("release_date"),
            "publisher": request.form.get("publisher"),
            "page_count": request.form.get("page_count"),
            "isbn": request.form.get("isbn")
        }
        mongo.db.booksread.update_one({"_id": ObjectId(book_id)}, submit)
        mongo.db.bookstoberead.update_one({"_id": ObjectId(book_id)}, submit)
        flash("Book Entry Edited")

    unreadbooks = mongo.db.bookstoberead.find_one({"_id": ObjectId(book_id)})
    books = mongo.db.booksread.find_one({"_id": ObjectId(book_id)})
    categories = mongo.db.reading_list.find().sort("category_name", 1)

    return redirect(url_for("profile", booksread=books, readinglist=categories, bookstoberead=unreadbooks))

这是与之相关联的后置操作:

<form class="col s12" method="POST" action="{{ url_for('edit_book', book_id=book_id, username=username) }}">

repos在这里(Personal Library App),具有所有功能的应用程序在“app.py“下,表单链接的页面在templates文件夹下的“profile.html”。
实时预览是On Heroku,如果这有助于查看事物链接在一起的位置。您可以使用Tester/Tester 1的用户名/密码进行访问。
我试过为post操作、函数和路径传递不同的参数。我不知道我是否传递了错误的参数,或者是否错过了一些示例,我仍然对参数非常非常模糊。我试过了解一些文档的头或尾,但有些东西就是不点击。
任何和每一件帮助是绝对感谢。

smtd7mpg

smtd7mpg1#

在Flask中,可以向Route添加变量,然后将其作为关键字参数传递给视图函数。在示例中,您定义了一个具有两个参数book_idusername的方法。但在路由中,您username定义为变量@app.route("/profile/<username>", ...)
当flask尝试只使用用户名调用您的方法时,这将导致类型错误。
因为您还没有发布错误消息,所以我只能假设引发了类似下面的错误消息。TypeError: edit_book() missing 1 required positional argument: 'book_id'
url_for('edit_book', book_id=book_id, username=username)方法生成的URL不会引发任何错误,并构建一个类似profile/exampleuser?book_id=99的URL,其中所有未知参数都作为查询参数。
作为一种修复方法,您可以简单地添加book_id作为第二个路由变量。

@app.route("/profile/<username>/<book_id>", methods=["GET", "POST"])
def edit_book(book_id, username):

有关其他信息,请查看:

  • https://flask.palletsprojects.com/en/2.2.x/api/#url-route-registrations
  • https://flask.palletsprojects.com/en/2.2.x/quickstart/#variable-rules

相关问题