JINJA模板繼承 block
阿新 • • 發佈:2018-11-09
Flask
中的模板可以繼承,通過繼承可以把模板中許多重複出現的元素抽取出來,放在父模板中,並且父模板通過定義block
給子模板開一個口,子模板根據需要,再實現這個block
,假設現在有一個base.html
這個父模板,程式碼如下:
<!DOCTYPE html> <html lang="en"> <head> <link rel="stylesheet" href="base.css" /> <title>{% block title %}{% endblock %}</title> {% block head %}{% endblock %} </head> <body> <div id="body">{% block body %}{% endblock %}</div> <div id="footer"> {% block footer %} © Copyright 2008 by <a href="http://domain.invalid/">you</a> {% endblock %} </div> </body> </html>
以上父模板中,抽取了所有模板都需要用到的元素html
、body
等,並且對於一些所有模板都要用到的樣式檔案style.css
也進行了抽取,同時對於一些子模板需要重寫的地方,比如title
、head
、body
都定義成了block
,然後子模板可以根據自己的需要,再具體的實現。以下再來看子模板的程式碼:
{% extends "base.html" %} {% block title %}首頁{% endblock %} {% block head %} {{ super() }} <style type="text/css"> .detail{ color: red; } </style> {% endblock %} {% block content %} <h1>這裡是首頁</h1> <p class="detail"> 首頁的內容 </p> {% endblock %}
首先第一行就定義了子模板繼承的父模板,並且可以看到子模板實現了title
這個block
,並填充了自己的內容,再看head
這個block
,裡面呼叫了super()
這個函式,這個函式的目的是執行父模板中的程式碼,把父模板中的內容新增到子模板中,如果沒有這一句,則父模板中處在head
這個block
中的程式碼將會被子模板中的程式碼給覆蓋掉。
另外,模板中不能出現重名的block
,如果一個地方需要用到另外一個block
中的內容,可以使用self.blockname
的方式進行引用,比如以下示例:
<title> {% block title %} 這是標題 {% endblock %} </title> <h1>{{ self.title() }}</h1>
以上示例中h1
標籤重用了title
這個block
中的內容,子模板實現了title
這個block
,h1
標籤也能擁有這個值。
另外,在子模板中,所有的文字標籤和程式碼都要新增到從父模板中繼承的block
中。否則,這些文字和標籤將不會被渲染。
附:轉載黃勇老師知了課堂的flask進階筆記