主Jinja模板中的逻辑

时间:2014-02-10 00:54:26

标签: python architecture flask

在我的app.py文件中,我将导航存储在dict中。键是主导航键,值是子菜单。

navigation = {"Search": ["Google","Yahoo","Bing"]}

在我的layout.html模板(我的主模板文件)中,我想调用dict来生成导航。对我而言,这样做是有意义的,因为它将贯穿每一页。但是,对于我所拥有的每个视图,我都必须定义“导航”。这似乎是多余的和不必要的。

这引出了我的问题,构建网站的适当方式是什么。我不想硬编码每个链接。如果我决定更改应用程序提供的内容,我希望更改在整个站点级联到我正在使用导航词典的所有其他区域。

结构示例:

#app.py
navigation = {"Search": ["Google","Yahoo","Bing"]}
def my_view():
    return render_template('my_view.html')

#layout.html
{% for link in navigation %}
    {{ link }}
{% endfor %}

要解决我的问题,我只需将导航全局添加到视图中。

return render_template('my_view.html', navigation=navigation)

我不想为每个视图添加导航。感觉多余,特别是当你可以有几十个观点时。

1 个答案:

答案 0 :(得分:1)

看起来你正在使用Flask。如果您将字典添加到应用程序的配置中,则可以在模板中调用该字典(Jinja将变量config识别为应用程序的配置),而不必将其传入。

#app.py
app.config['navigation'] = {"Search": ["Google","Yahoo","Bing"]}
def my_view():
    return render_template('my_view.html')

#layout.html
{% for title, name in config.navigation.iteritems() %}
    {{ title }}, {{ name }}
{% endfor %}

(我也让你的布局迭代了dict,而不仅仅是键 - 它看起来更像是你想要的。)