![](/img/trans.png)
[英]How do I render a template form inside another template. Python, Flask, Jinja2
[英]Flask: How do I place Forms in Base jinja2 Template?
我是Flask的新手,正在用搜索工具编写一个简单的Flask应用程序。 与google搜索类似,我希望在显示结果时保留搜索结果页面中的搜索输入框。因此,我将搜索表单放置在基本模板中,并从基本模板派生了搜索结果模板,以同时显示搜索表单和搜索结果。
为此,我做了以下事情:
具有页面元数据和表单(即使在结果页面中也应基本存在)的基本模板(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的派生的.html。 base.html具有应设置的形式。
预先谢谢你
您只需要将form关键字参数传递给其他render_template
调用。
return render_template('derived.html', result=result)
相反,应为:
return render_template('derived.html', result=result, form=form)
之所以需要这样做,是因为Web是无状态的-呈现的模板未保留在Flask的一侧。 将HTML发送到客户端,然后就Flask而言,一切都已完成。 从服务器的角度来看,POST请求是一个单独的请求,唯一被调用的是render_template('derived')
调用。 创建表单并将其发送到search.html
并没有“记忆”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.