# 模板繼承
## 模板繼承
* 模板繼承可以減少頁面內容的重復定義,實現頁面內容的重用
* 典型應用:網站的頭部、尾部是一樣的,這些內容可以定義在父模板中,子模板不需要重復定義
* block標簽:在父模板中預留區域,在子模板中填充
* extends繼承:繼承,寫在模板文件的第一行
* 定義父模板base.html
```text
{%block block_name%}
這里可以定義默認值
如果不定義默認值,則表示空字符串
{%%endblock}
```
* 定義子模板main.html
```text
{% extends "base.html" %}
```
* 在子模板中使用block填充預留區域
```text
{% block block_name%}
實際填充內容
{%endblock%}
```
## 說明
* 如果在模板中使用extends標簽,必須是模板中的第一個標簽
* 不能在一個模板中定義多個相同名字的block標簽
* 子模板不必定義全部父模板中的blocks,如果子模板沒有定義block,則使用了父模板中的默認值
* 如果發現在模板中大量的賦值內容,那就應該把內容移動到父模板中
* 使用可以獲取父模板中block的內容
* 為了更好的可讀性,可以給endblock標簽一個名字
```text
{% block block_name%}
區域內容
{% endblock block_name%}
```
## 三層繼承結構
* 三層階乘結構使代碼得到最大程度的復用,并且使得添加內容更加簡單
* 常見的結構頁面

### 創建根級目錄
* 名稱為"base.html"
* 存放整個站點共用的內容
```text
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>
{% block title %}
{% endblock title %}
商城
</title>
</head>
<body>
<div>
top--{{ logo }}
<hr />
{% block left %}
{% endblock %}
{% block content %}
{% endblock %}
<hr />
bottom
</div>
</body>
</html>
```
### 創建分支模板
* 繼承自base.html
* 創建base\_goods.html模板
```text
{% extends 'myapp/base.html' %}
{% block title %}
天使
{% endblock %}
{% block left %}
<h1>goods left</h1>
{% endblock %}
```
* 定義base\_user.html模板
```text
{% extends 'myapp/base.html'%}
{% block title %}
用戶中心
{% endblock %}
{% block left %}
<h1 style="color:blue">user left</h1>
{% endblock %}
```
* 定義index.html,繼承自base.html
```text
{% extends 'myapp/base.html' %}
{% block content %}
首頁內容
{% endblock %}
```
### 為具體頁面創建模板,繼承自分支模板
* 定義商品列表頁goodslist.html
```text
{% extends 'myapp/base_user.html' %}
{% block content %}
商品正文列表
{% endblock %}
```
* 定義用戶密碼userpwd.html
```text
{% extends 'myapp/base_user.html' %}
{% block content %}
用戶密碼修改
{% endblock %}
```
#### 視圖調用具體頁面,并傳遞模板中需要的數據
* 首頁視圖index
```text
def index(request):
return render(request,'myapp/index_two.html',{'logo':'首頁'})
```
* 商品列表視圖goodlist
```text
def goodlist(request):
return render(request,'myapp/goodslist.html',{'logo':'貨物'})
```
* 用戶密碼視圖userpwd
```text
def userpwd(request):
return render(request,'myapp/userpwd.html',{'logo':'密碼'})
```
### 配置url
```text
from django.conf.urls import url,include
from . import views
app_name = 'myapp'
urlpatterns = [
url(r'^index/$',views.index_two),
url(r'^list/$',views.goodlist),
url(r'^pwd/$',views.userpwd),
]
```