【问题标题】:How to pass collection of variables to templates如何将变量集合传递给模板
【发布时间】:2013-07-24 02:21:36
【问题描述】:

我一直在用 flask 和 SqlAlchemy 构建一个博客引擎,我已经达到了以下几点:

  • 具有左右侧边栏的通用基础模板 基于查询动态生成的页脚区域。
  • 在每个视图中传递的一些变量以填充所述侧边栏和页脚。

我的问题是:

有没有一种方法可以将一组变量传递给烧瓶应用程序中的每个视图,而不必在 render_template() 调用中传递它们?

【问题讨论】:

    标签: flask jinja2


    【解决方案1】:

    使一组变量可用于模板的最简单方法是将它们添加到flask.g

    例如,您可以拥有g.left_sidebarsg.right_sidebarsg.footer,每个数组都包含您正在使用的变量。这些变量可能具有预渲染的 HTML(可能会缓存,以避免每次都渲染它们),或者它们可能是要包含的子模板的名称。

    由于flask.g 自动提供给模板,您只需在每次请求期间或在before_request 处理程序中填充这些数组。

    【讨论】:

      【解决方案2】:

      导入侧边栏和其他重复元素的传统方式是导入到您的页面模板继承的布局模板中。示例:

      layout.html:

      <!DOCTYPE html>
      <html lang="en">
        <head>
        </head>
        <body>
          {% include sidebar.html %}
          {% block body %}
          {% endblock body %}
        </body>
      </html>
      

      post.html:

      {% extends "layout.html" %}
      {% block body %}
        {{ post }}
      {% endblock %} 
      

      你也可以像这样创建一个全局函数:

      def createNav():
          nav = '''
              <ul class="nav">
                  <li><a href="/">Home</a></li>
                  <li><a href="/about">About</a></li>
              </ul>
          '''
          return nav
      
      #make function available inside jinja template
      app.jinja_env.globals.update(createNav=createNav)
      

      然后这样调用:

      post.html:

      {% extends "layout.html" %}
      {% block body %}
        {{ createNav() }}
        {{ post }}
      {% endblock %} 
      

      【讨论】:

      • 您的回答很棒,app.jinja_env.globals 部分会有所帮助。米格尔斯的回答虽然简短,但更直接地击中了我想要的东西。谢谢!!
      猜你喜欢
      • 2017-11-10
      • 2016-09-26
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 2019-04-03
      • 2011-05-08
      • 2015-08-24
      • 1970-01-01
      相关资源
      最近更新 更多