我最近遇到了瓶装问题,这几乎是我第一次使用模板引擎。(之前我会简单地制作我需要的传统PHP)
我的问题是,我们说我有一个基本布局(简单的HTML / CSS布局),例如;一边是登录框。如何使登录框保持最新,而不必在每条路径上传递值?
以此为例:
from bottle import route,template
@route('/')
def main():
return template("content.tpl") #rebase from layout.tpl
layout.tpl:
<html>
<head>
<title>{{title}}</title>
</head>
<body>
%include
<div id='sidebar'><!-- login box --></div>
</body>
</html>
我想我的主要问题是如何确保登录框运行而不必在每个页面插入变量
答案 0 :(得分:2)
要使变量在所有模板中可用,请在路线之前输入类似的内容:
from bottle import BaseTemplate
BaseTemplate.defaults['symbol_name'] = value
我用它来为我的模板添加辅助函数。
更正确的解决方案可能涉及编写插件,这不是非常困难,并且在Bottle文档中有所介绍。
答案 1 :(得分:1)
我不熟悉瓶子,但对于其他模板引擎,这种事情是通过继承完成的。
例如,
想象一下,您有一个名为content.tpl
的基本模板,看起来就像您对layout.tpl
所拥有的那样:
<html>
<head>
<title>{{title}}</title>
</head>
<body>
<div id='sidebar'>%% section "sidebar" %%</div>
<div id='content'>%% section "content" %%</div>
</body>
</html>
请注意,这是伪代码 - 由%% ... %%
标记的内容组成&amp;并不对应任何特定的模板引擎(AFAIK)。
对于您的登录页面,您将拥有另一个名为login.tpl
的模板文件:
%% extends "content.tpl" %%
%% start section "sidebar" %%
<!-- whatever you put here will be rendered -->
<!-- in the "sidebar" section of the parent -->
%% end section "sidebar" %%
%% start section "content" %%
<!-- whatever you put here will be rendered -->
<!-- in the "content" section of the parent -->
<form> ... </form>
%% end section "content" %%
然后,在您登录页面的路线中,您将执行以下操作:
`return template("login.tpl")`
这将导致模板引擎加载login.tpl
,填写它拥有的值,然后加载content.tpl
并将它放在一起的内容粘贴到&#34;侧边栏&#34;和&#34;内容&#34;切片进入适当的位置。
还有另一种机制可以从多个模板组成页面:包括文件。这与上面的示例类似,例外情况是您的登录页面如下所示:
<html>
<head>
<title>{{title}}</title>
</head>
<body>
<div id='sidebar'>%% include "sidebar.tpl" %%</div>
<div id='content'>%% include "content.tpl" %%</div>
</body>
</html>
它们之间的主要区别是:
当您继承时,您不会在每个页面上重复所有内容 - 所有页面的常量都可以从父布局继承。
< / LI>当您继承时,您还可以将多个模板中的内容合并为一个。例如,假设你有像这样继承的模板&#34; main.tpl&#34; - &GT; &#34; template1.tpl&#34; - &GT; &#34; template2.tpl&#34 ;.在某些模板引擎中可以对其进行设置,以便每个模板都可以添加到一个部分,以便内容可以是整个模板系列的组合。
当然,也可以混合使用这些技术。