假设我有一个带有标题的基本模板,并且该标题的内容需要传递到模板中。
<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...
因为谁知道我可能拥有多少个子页面。它感觉不够干燥。
我实际上从未实际渲染基本模板,只渲染其子项,但我不知道如何传递数据。
有办法做到这一点吗?我应该不使用继承吗?
答案 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