导航中的变量传递给Jinja 2中的基础和所有模板

时间:2017-08-03 08:10:32

标签: python json templates variables jinja2

我有一个NavHandler来传递导航页面的json数据。我想将导航包含在基础中,以便所有页面都可以看到导航。

我可以在nav.html中看到JSON数据,但它不会显示在base.htmlindex.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 %}

1 个答案:

答案 0 :(得分:2)

您可以使用context processor在模板中注入全局变量。

  

将新变量自动注入模板的上下文中,   Flask中存在上下文处理器。上下文处理器在之前运行   模板被渲染并具有注入新值的能力   模板上下文。

结帐this questionthis answer,他们可能会帮助您。

修改:针对新问题更新

更改此行:

return dict(format_price=g.format_price)

这个:

return dict(format_price=format_price)