include
標簽允許在模板中包含其它的模板的內容。 標簽的參數是所要包含的模板名稱,可以是一個變量,也可以是用單/雙引號硬編碼的字符串。 每當在多個模板中出現相同的代碼時,就應該考慮是否要使用 {% include %}
來減少重復
1. include 標簽的基本用法
假設我們在多個 HTML 模板中都需要用到顯示用戶自定義的 HTML 片段,顯示的方式是一個標題加上需要顯示的具體內容。
下面的這個模板文件 html-section.html
就滿足了基本的需求,我們可以在不同的 HTML 模板中引入這個子模版。
include
后面可以使用字符串或者變量名來指定模板路徑
<div class="section-title">
<span>{{title}}</span>
</div>
<div class="section-content">
<div id="{{section_id}}">{% autoescape off %}{{content | default:''}}{% endautoescape %}</div>
</div>
在各個父模板中就可以使用 include
指令來引入這個子模版。
由於默認情況下子模版可以訪問復模版中的變量,子模版可以正常顯示指定的 HTML 內容。
{% include 'html-section.html' %}
## 2. include with
如果需要在一個網頁多次引入同一個子模版,上面的方式就會出現問題。
因為在子模版中我們指定了變量名稱,這個時候我們可以使用 with
關鍵字給子模版指定變量
{% include 'html-section.html' with title="Summary" content=article_summary section_id="article-summary" %}
{% include 'html-section.html' with title="Article Body" content=article_body section_id="article-body" %}
{% include 'html-section.html' with title="Contact US" content=article_footer section_id="article-contact" %}
### 2.1 使用過濾器修改變量
設想一下這樣的場景:一個 HTML 頁面中多次引入了一個子模版,其中部分 include
語句需要做一些定制。
比如說在變量后面加入固定的文字。
當然可以通過修改子模版滿足任意的定制化需求。但如果僅僅只是變量上的改變, 修改子模版就顯得太繁瑣。
而 with
關鍵字可以在不改變子模版的前提下,使用過濾器來修改變量的值
假如我們需要將上面的子模版做以下的修改:
- 使用 content 里面的第一個單詞作為標題
- 所有的標題后面添加指定的內容
- 標題的第一個字母要保證大寫
在不改變子模版的前提下,我們可以將 include 語句做以下的修改
{% include 'html-section.html' with title=content|truncatewords:1|add:' Section'|capfirst content=article_footer section_id="article-contact" %}
### 2.2 阻止子模版訪問除了 `with` 指定的變量
默認情況下子模版可以訪問父模板的所有變量,在 Django 中還可以通過使用 only
選項來阻止這個默認行為
{% include "html-section.html" with title="Summary" content=article_summary section_id="article-summary" only %}
## 3. with 標簽
另外 Django 還提供了單獨的 with
標簽來修改或者指定變量的值。
可以單獨使用,也可以搭配 include
標簽使用。使用方法如下:
<!-- 使用 with 標簽指定變量 -->
{% with title="summary" content=article_body|capfirst section_id="article-body" %}
{% include 'html-section.html' %}
{% endwith %}
<!-- 使用 with as -->
{% with content|truncatewords:1|capfirst as title %}
{% include 'html-section.html'%}
{% endwith %}
轉載請注明出處: [zf-l](http://www.cnblogs.com/zf-l/p/django-include.html)