如何在 Flask 中使用相同的信息呈现两个 HTML 页面?

How do I render two HTML pages using the same information in Flask?

在 Flask 的 dashboard() 函数中,给用户一个搜索表单来填写,填写表单后,他将获得他搜索的一些书籍的名称。单击书名后,他应该会被定向到一个 HTML 页面,他可以在该页面上获得有关该书的一些信息。

@app.route('/dashboard', methods=['GET','POST'])
def dashboard():
    form = SearchForm()

    if form.validate_on_submit():
        if form.ISBN.data:
            results = Books.query.filter(Books.ISBN.like('%' + form.ISBN.data + '%')).all()
        elif form.Title.data:
            results = Books.query.filter(Books.Title.like('%' + form.Title.data + '%')).all()
        return render_template('search_results.html', name=current_user.username, form = form, results=results)

    return render_template('dashboard.html', name=current_user.username, form = form)

在上面的函数中,SearchForm 是一个 WTF flask 表单。

这是我的代码 search_results.html:

{% for result in results: %}
   {{result.ISBN}}
   <a href="{{url_for('details')}}">{{result.Title}}</a> 
{%endfor%}

这是我的详细信息功能:

@app.route('/dashboard/details', methods = ['GET', 'POST'])
def details():
    if request.method == 'POST':
        return render_template('details.html')
    return render_template('details.html')

我想要的是,获取用户在 dashboard() 函数中填写的表单数据,并在 details() 函数中使用该数据将该信息传递到 details.html 页面,其中我会打印用户填写的数据,以及存储在数据库中的书的数据。
但是我不知道该怎么做。
我尝试使用 global form = SearchForm() 使表单全局化,但这给了我一个语法错误:

global form = SearchForm()
                ^
SyntaxError: invalid syntax

如有任何帮助,我们将不胜感激。

您可以将参数传递给'url_for' 函数,也称为url 参数,通常使用ID。例如:

{{ url_for('details', book_id=res.id) }}

那么您将能够获得传递的参数,例如:

@app.route('/dashboard/details/<int:book_id>')
def details(book_id):

但是,如果您的标题是唯一的,并且您使用它们查询数据,那么您也完全可以将它们用作参数。

您可以使用 flask 会话全局变量来满足您的目的。请参考:https://flask.palletsprojects.com/en/1.1.x/api/#flask.session

这是一个很好的教程,其中包含有关如何使用 flask session 全局变量的更详细信息: https://www.javatpoint.com/flask-session

您可以将数据传递到 url_for 函数,只需添加一个逗号并将数据放在逗号之后(就像您在 render_template 中所做的那样) 所以你需要做的是在你的 html

{{ url_for('details', book_id=res.id) }}

这在你的路线中

@app.route('/dashboard/details/<int:book_id>')
def details(book_id):