Jinja2和Flask:将变量传递给父模板而不将其传递给子模板

时间:2013-07-23 19:19:11

标签: python templates variables flask jinja2

假设我有一个带有标题的基本模板,并且该标题的内容需要传递到模板中。

<header>
  You are logged in as {{ name }}
</header>

此基本模板扩展了许多页面。如何传递该变量而不将其传递给每个孩子?例如,我不想这样做:

render_template("child1.html", name=user.name)
render_template("child2.html", name=user.name)
render_template("child3.html", name=user.name)
etc...

因为谁知道我可能拥有多少个子页面。它感觉不够干燥。

我实际上从未实际渲染基本模板,只渲染其子项,但我不知道如何传递数据。

有办法做到这一点吗?我应该不使用继承吗?

2 个答案:

答案 0 :(得分:11)

我建议你在烧瓶中使用全局变量'g'。默认情况下,这在jinja模板中可用。因此,您无需担心将其传递到基本模板或子项中的任何位置。只需确保在登录时首先进行设置

g.username = user.name

然后在模板中,只需执行此操作:

You are logged in as {{ g.username }}

答案 1 :(得分:2)

您需要使用Flask&#39; SO question and answer

  body
    nav.navbar.navbar-default(role='navigation')
      .container
        .navbar-header
          button.navbar-toggle(type='button', data-toggle='collapse', data-target='.navbar-collapse')
            span.sr-only Toggle navigation
            span.icon-bar
            span.icon-bar
        span.icon-bar
          div.dropdown
            a.navbar-brand.dropdown(href='#', data-toggle='dropdown')
              | Title
                    span.caret
            ul.brand-dropdown.dropdown-menu(role='menu')
              li
                a(href=route.auth('custservice')) Customer Service
              li
                a(href=route.auth('help')) Help

        .navbar-collapse.collapse
          form.navbar-form.navbar-left(role='search')
            .inner-addon.left-addon
              a.fa.fa-search.fa-lg(href='', type='submit')
              input.form-control(type='text', placeholder='Search')
          block nav
              ul.nav.navbar-nav.navbar-right
                li
                  a= auth.user().first_name
                li
                  a.fa.fa-shopping-cart.fa-2x(href=route.auth('cart'))

请参阅此类似{{3}}。

我如何使用它的示例(简单地插入应用配置设置):

@app.context_processor
def inject_user():
    return dict(user=g.user)

从我的Flask配置文件中提取的内容:

@app.context_processor
def lib_versions():
    return dict(
        bokehversion = app.config['BOKEH_VERSION'],
        jqueryversion = app.config['JQUERY_VERSION'],
        jqueryuiversion = app.config['JQUERYUI_VERSION'],
        bootstrapversion = app.config['BOOTSTRAP_VERSION'],
    )

然后,您可以像在任何其他Jinja2变量中一样在基本模板中调用它们:

class Config(object):
    DEBUG = True
    TESTING = True
    SQLALCHEMY_DATABASE_URI = ''
    TMP_DIR = ''
    STATIC_FOLDER = ''
    BOKEH_VERSION = '0.8.2'
    JQUERY_VERSION = '1.11.2'
    JQUERYUI_VERSION = '1.11.4'
    BOOTSTRAP_VERSION = '3.3.4'

class ProductionConfig(Config):
    DEBUG = False
    TESTING = False