【问题标题】:Logic in Primary Jinja Template初级 Jinja 模板中的逻辑
【发布时间】:2014-03-07 04:51:38
【问题描述】:

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

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)

我不想为每个视图添加导航。感觉多余,尤其是当您可以拥有数十个视图时。

【问题讨论】:

  • 你能在所有视图之外定义导航,使其基本上是全局的吗?
  • @Totem 我很确定它是一个全球性的。我将提供一个正在发生的事情的例子。如果我加载 /login,它将调用登录视图,该视图将调用扩展 layout.html 的 login.html 模板。登录视图看到布局模板上使用了“导航”并引发错误,因为尚未告知视图导航的含义。
  • 您的模板中是否包含 {{ }} 导航?
  • @Totem 是的。我做了这样的事情: {% for link in navigation %}{{ link }}{% endfor %} on my layout.html file.
  • 如果您希望导航出现在扩展 layout.html 上的所有页面,并且导航在 layout.html 上的 {{% block content %}} 之外,那么它应该出现在所有这些页面上页。但是,如果它甚至在 layout.html 上都不起作用,那么您的问题可能在于您如何在模板中调用 dict

标签: python architecture flask


【解决方案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 %}

(我还让你的布局迭代了字典,而不仅仅是键 - 看起来这更像是你想要的。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-02-23
    • 2013-07-25
    • 2016-03-09
    • 2015-12-09
    • 2012-02-27
    • 1970-01-01
    • 2018-12-30
    • 2013-03-02
    相关资源
    最近更新 更多