【问题标题】:Flask: How do I place Forms in Base jinja2 Template?Flask:如何在 Base jinja2 模板中放置表单?
【发布时间】:2014-08-04 07:18:33
【问题描述】:

我是 Flask 新手,正在编写一个带有搜索功能的简单 Flask 应用程序。与谷歌搜索类似,我想在显示结果的同时保留搜索结果页面中的搜索输入框。所以,我将搜索表单放在基本模板中,并从基本模板中派生出一个搜索结果模板,以显示搜索表单和搜索结果。

为此,我做了以下事情:-

带有页面元数据和表单的基本模板(base.html)(即使在结果页面中也应该基本存在)。

<html>
  <head>
    {% if title %}
    <title>{{title}}</title>
    {% else %}
    <title>Search</title>
    {% endif %}
  </head>
  <body>
    <h1>Search </h1>
<form action="/series_search" method="post" name="search">
    {{form.hidden_tag()}}
    <p>
        Please enter query: <br>
        {{form.search(size=10)}}
    </p>
    <p><input type="submit" value="Search"></p>
</form>
<br>
{% block content %}{% endblock %}

  </body>
</html>

派生模板(derived.html)有以下代码,继承了基础模板(有搜索模板):

{% extends "base.html" %}

{% block content %}
<h1>Search Result</h1>
    {% if result %}
    <p> Title: {{result.title}}</p>
    {% else %}
    <p> search not found!!</p>
    {% endif %}
{% endblock %}

而且,在视图中,如下

@app.route('/search', methods = ['POST', 'GET'])
def search():
    form = SearchForm()
    if form.validate_on_submit():
        print "form validated"
        query = form.search.data
        result = Lib.get_result(query)
        return render_template('derived.html', result = result)
    return render_template('search.html',
    title = 'Search',
    form = form)

如果我输入查询并提交搜索表单,则会收到以下错误,

....
....
File "/Users/webapp/app/templates/derived.html", line 1, in top-level template code
    {% extends "search.html" %}
  File "/Users/webapp/app/templates/search.html", line 12, in top-level template code
    {{form.hidden_tag()}}
  File "/Users/webapp/flask/lib/python2.7/site-packages/jinja2/environment.py", line 397, in getattr
    return getattr(obj, attribute)

所以,基本上在按下提交按钮后,视图会呈现派生自 base.html 的 derived.html。 base.html 有一个应该设置的表单。

  1. 如何在调用派生模板时传递基础模板的表单对象?
  2. 我的方法是否适合我想要实现的目标?如果有其他的,请提出建议。

提前谢谢你

【问题讨论】:

    标签: python flask jinja2 flask-wtforms


    【解决方案1】:

    您只需将表单关键字参数传递给您的另一个 render_template 调用。

    return render_template('derived.html', result=result)
    

    应该是:

    return render_template('derived.html', result=result, form=form)
    

    需要这样做的原因是因为 web 是无状态的 - 渲染的模板没有保存在 Flask 端。就 Flask 而言,HTML 被发送到客户端,然后一切都完成了。从服务器的角度来看,POST 请求是一个单独的请求,唯一被调用的是render_template('derived') 调用。没有创建表单并将其发送到search.html 的“记忆”。

    【讨论】:

    • 非常感谢。有效!!我不知道我是怎么错过的。
    猜你喜欢
    • 1970-01-01
    • 2015-06-15
    • 2020-09-21
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 2014-02-13
    相关资源
    最近更新 更多