我有一个NavHandler
来传递导航页面的json数据。我想将导航包含在基础中,以便所有页面都可以看到导航。
我可以在nav.html
中看到JSON数据,但它不会显示在base.html
和index.html
中。
我可以知道如何将变量传递给所有模板吗?
我错过了什么?
除此之外,我还遵循了Jinja2示例代码来测试on @ app.context_processor和nav.html,但给出了未定义的变量。
main.py
from flask import Flask
app = Flask(__name__)
@app.context_processor
def utility_processor():
def format_price(amount, currency=u''):
return u'{0:.2f}{1}'.format(amount, currency)
return dict(format_price=format_price)
class NavHandler(weapp2.RequestHandler):
def get(self):
json_str = '''[{"name":"Nav A", "link":"link 1"},{"name":"Nav B", "link":"link 2"},{"name":"Nav C", "link":"link 3"}]'''
json_data = json.load(json_str)
template_vars = json_data
template = JINJA_ENVIRONMENT.get.template('nav.html')
self.response.write(template.render(template_vars, jason_data=json=data))
class BaseHandler(weapp2.RequestHandler):
def get(self):
template_vars = { 'title' : title}
template = JINJA_ENVIRONMENT.get.template('nav.html')
self.response.write(template.render(template_vars))
nav.html
{% block nav %}
<ul>
{% for d from json_data %}
<li><a href="{{ d.link }}">{{ d.name }}</a>
{% endfor %}
</ul>
<script>
console.log({{ format_price(0.33) }});
</script>
{ endblock %}
base.html文件
<!doctype html>
<html>
<head>
<meta charset="utf-8"/>
<title>{% block title %} - My Site</title>
</head>
<body>
<div>Navbar</div>
{% include nav.html %}
{% block content %}{% endblock %}
</body>
</html>
的index.html
{% extends 'base.html' %}
{% block content %}
<h3>{% block title %}Home{% endblock %}</h3>
<p>Hello, World!</p>
{% endblock %}
答案 0 :(得分:2)
您可以使用context processor在模板中注入全局变量。
将新变量自动注入模板的上下文中, Flask中存在上下文处理器。上下文处理器在之前运行 模板被渲染并具有注入新值的能力 模板上下文。
结帐this question和this answer,他们可能会帮助您。
修改:针对新问题更新
更改此行:
return dict(format_price=g.format_price)
这个:
return dict(format_price=format_price)