2013-08-22 40 views
2

我需要將塊從基本模板傳遞到帶有上下文的包含模板,但不希望
將此塊重疊在基本模板中。 例如,我有幾個模板如何傳遞塊以包含Jinja2中的語句

了header.html

<header> 
    <title>{% block title %}{% endblock %}</title> 
</header> 

body1.html

{% include "test_header.html" ignore missing with context %} 
{% block title %}Title1{% endblock %} 
<body> 
    Hello 
</body> 

body2.html

{% include "test_header.html" ignore missing with context %} 
{% block title %}Title2{% endblock %} 
<body> 
    Hello 
</body> 

當我嘗試呈現body1.html時,頁面標題重命名爲「Title1」,但塊標題呈現兩次並在主體中顯示Title1。我如何準確地將這個上下文傳遞給include語句?

+0

一般來說,你有'extend'的用例,而不是'include'。我會創建一個包含'header.html'的'base.html'。然後我會從底部擴展body1和body2。 – alecxe

回答

1

包含動態內容(如標題)的方法通常是{{...}},而{%...%}用於控制語句(for循環,if語句,塊等)。你可能會構建特定的模板類似如下:

base.html文件

<html> 
<head> 
    <title>{{title}}</title> 
</head> 
<body> 
    {% block body %}{% endblock %} 
</body> 
</html> 

如前所述通過@alecxe,你應該extends掀起了基本模板。

body1.html

{% extends "base.html" %} 

{% block body %} 
Hello! 
{% endblock %} 

body2.html

{% extends "base.html" %} 

{% block body %} 
Hi! 
{% endblock %} 

標題應傳遞給模板與視圖render_template()

view.py摘錄

@app.route('/body1') 
def body1(): 
    title = "Body 1 Title" 
    return render_template("body1.html", title = title) 

@app.route('/body2') 
def body2(): 
    title = "Body 2 Title" 
    return render_template("body2.html", title = title) 

如果你想大大地改變模板之間的標題,你也可以用{% block header %}{% endblock %}base.html更換<title>{{title}}</title>。你的body1.html可能看起來像這樣:

{% extends "base.html" %} 

{% block header %} 
<title>{{title}}</title> 
{% endblock %} 

{% block body %} 
Hello! 
{% endblock %}