首页 > 解决方案 > 如何将来自“从模板 A 到模板 B”的模板 B 中的变量硬编码传递给路由函数?

问题描述

我正在构建一个显示书籍列表的 Web 应用程序,用户单击一本书,然后他被定向到一本书,其中包含该书的另一个信息列表。Books.html 将用户重定向到 review.html,问题是 books.html 文件中的 url_for 函数没有按预期工作。

books.html 文件是 bootstrap 4 预定义列表,我只是链接到 href="{{url_for('review', book_id=book.id)}}"

@app.route("/books")
def books():
    ''' show books in a list. '''

    # Select book info based on first characters.
    books = db.execute("SELECT * FROM books WHERE isbn LIKE :isbn", {"isbn":"0"+"%"})

    if books is None:
        raise RuntimeError("Error @ books route, Didn't fetch rows from books table.")

    return render_template("books.html",books=books)

@app.route("/books/<int:book_id>")
def review(book_id):
    ''' Show book information inner and API '''

    # Get book information from books table using book_id got from books.html
    bookInfo = db.execute("SELECT * FROM books WHERE id=:book_id", {"book_id": book_id}).fetchone()

    # Error handling.
    if bookInfo is None:
        raise RuntimeError("Error @ route: review, didn't fetch book information from books table.")

return render_template("review.html", bookInfo=bookInfo)

<!-- books.html -->
{% extends "base.html" %}

{%block body%}

  <!-- book list <books.html> -->
  <!-- this will have a template for loop over elements in database -->
  <div class="container list-group">
    {% for book in books %}
      <a href="{{url_for('review', book_id=book.id)}}" class="list-group-item list-group-item-action flex-column align-items-start">
        <div class="d-flex w-100 justify-content-between">
          <h5 class="mb-1">{{book.title}}</h5>
          <small><h6>ISBN: {{book.isbn}}</h6></small>
        </div>
        <p class="mb-1"><h6>author: {{book.author_name}}</h6></p>
        <small>publication year: {{book.publish_year}}</small>
      </a>
    {%endfor%}
  </div>

{%endblock%}

<!-- review.html -->
{% extends "base.html" %}

{%block body%}]
<!-- Book details, and user's review -->
<div class="container">
<dl class="row">
<dt class="col-sm-3">Book title</dt>
<dd class="col-sm-9">{{bookInfo.title}}</dd>

<dt class="col-sm-3">Book author</dt>
<dd class="col-sm-9">{{bookInfo.author_name}}</dd>

<dt class="col-sm-3">ISBN</dt>
<dd class="col-sm-9">{{bookInfo.isbn}}</dd>

<dt class="col-sm-3">Publication year</dt>
<dd class="col-sm-9">{{bookInfo.publish_year}}</dd>
</div>
{%endblock%}

我希望有一个关于用户选择的书的信息列表,但相反,我收到了这个错误:TypeError: The view function did not return a valid response。该函数要么返回 None ,要么在没有 return 语句的情况下结束。

标签: python-3.xflaskbootstrap-4jinja2flask-sqlalchemy

解决方案


推荐阅读