一、標籤的使用(tag)
1、語法格式:{% tags %}
2、提供的幾種標籤
- {% if %}:計算一個變量值,如果是“true”,即它存在、不爲空並且不是false的boolean值,系統則會顯示{% if %}和{% endif %}間的所有內容
{% if ani.age > 25 %}
<h1>{{ ani.name }},you have a lot of responsibilities!</h1>
{% elif ani.age >= 18 %}
<h1>{{ ani.name }},you have been an adult!</h1>
{% else %}
<h1>You just a child!</h1>
{% endif %}
- {% for %}:允許你按順序遍歷一個序列中的各個元素,每次循環模板系統都會渲染{% for %}和{% endfor %}之間的所有內容
{#for循環#}
{#注意:for是沒有辦法拿到索引的,只能用forloop.counter來拿#}
{% for name in li %}
<h3>{{ forloop.counter }}:{{ name }}</h3>
<h4>{{ forloop.revcounter }}:{{ name }}</h4>
{% endfor %}
{% for name in li %}
{% if forloop.first %}
{# 創建一個列表標籤,並且帶有class爲first的標籤背景色變紅#}
<li class="first">
{% else %}
<li>
{% endif %}
{{ name }}
</li>
{% empty %}
<h1>沒有相關文章!</h1>
{% endfor %}
- {%csrf_token%}:用於生成csrf_token的標籤,用於防治跨站攻擊驗證。
- {% url %}:引用路由配置的地址
{#{% url %}引用路由配置地址#}
<form action="{% url 'login' %}" method="post">
<p>賬號:<input type="text"></p>
<p>密碼:<input type="text"></p>
<p><input type="submit"></p>
{% csrf_token %}
{# 一種Django的安全機制,相當於給頁面加上了一個身份證——一串編碼,有了這個纔可以正常跳轉到url 'login'頁面#}
</form>
- {% with %}:用更簡單的變量名替代複雜的變量名
{% with total=fhjsaldfhjsdfhlasdfhljsdal %} {{ total }} {% endwith %}
- {% verbatim %}:禁止render
{% verbatim %}
{{ hello }}
{% endverbatim %}
- {% load %}: 加載標籤庫
二、自定義filter和simple_tag
1、自定義filter過濾器
- a、首先在app中創建templatetags模塊
- b、然後創建任意 .py 文件,如:myTag.py
- c、套用引用代碼:
from django import template
from django.utils.safestring import mark_safe
register = template.Library() #register的名字是固定的,不可改變
- d、編寫自定義的函數
- e、在使用自定義simple_tag和filter的html文件中導入之前創建的 my_tags.py :{% load my_tags %}
- f、在html中調用:由於filter函數只接收兩個參數,因此此處只能傳入一個參數,可以是列表、字典
<h1>filter:{{ ani.age|filter_muti:3 }}</h1>
2、自定義simple_tag:
可以傳任意個參數,用空格隔開
simple_tag_muti函數已經在上圖展示了,這裏直接調用
<h1>simple_tae:{% simple_tag_muti 26 2 10%}</h1>
3、注意:
- a、在settings中的INSTALLED_APPS配置當前app,不然django無法找到自定義的simple_tag
- b、filter可以用在if等控制語句後,simple_tag不可以
{% if num|filter_multi:30 > 100 %}
{{ num|filter_multi:30 }}
{% endif %}
三、extend模板繼承
1、include 模板標籤
該標籤允許在(模板中)包含其它的模板的內容。 標籤的參數是所要包含的模板名稱,可以是一個變量,也可以是用單/雙引號硬編碼的字符串。 每當在多個模板中出現相同的代碼時,就應該考慮是否要使用 {% include %} 來減少重複。
2、extend繼承模板標籤
在整個網站中,如何減少共用頁面區域(比如站點導航)所引起的重複和冗餘代碼?
比如,如果有一個更典型的網站,它有導航條、樣式表,可能還有一些 JavaScript 代碼,事情必將以向每個模板填充各種冗餘的 HTML 而效率低下。
傳統解決方法是使用 服務器端的 includes ,你可以在 HTML 頁面中使用該指令將一個網頁嵌入到另一箇中。 事實上, Django 通過剛纔講述的 {% include %} 支持了這種方法。
3、extend 的本質
模板繼承就是先構造一個基礎框架模板,而後在其子模板中對它所包含站點公用部分和定義塊進行重載。
4、繼承的步驟
(1) 創建 base.html 模板,在其中定義站點的主要外觀感受。 這些都是不常修改甚至從不修改的部分。
(2) 爲網站的每個區域創建 base_SECTION.html 模板(例如, base_photos.html 和 base_forum.html )。這些模板對base.html 進行拓展,幷包含區域特定的風格與設計。
(3)爲每種類型的頁面創建獨立的模板,例如論壇頁面或者圖片庫。 這些模板拓展相應的區域模板。
這個方法可最大限度地重用代碼,並使得向公共區域(如區域級的導航)添加內容成爲一件輕鬆的工作
5、繼承後的修改
{#繼承base.html#}
{% extends 'base.html' %}
{#修改樣式:前提是base裏面也必須有{% block style %}#}
{% block styles %}
<style>
h2{
background-color: yellowgreen;
}
</style>
{% endblock %}
{#但是有一部分需要修改,則只能改{{ block }}裏的內容#}
{% block content %}
{# 獲取父類#}
{{ block.super }}
{% for s in student_list %}
<h2>學生{{ s }}</h2>
{% endfor %}
{% endblock %}
6、extend繼承注意
-
如果在模板中使用 {% extends %} ,必須保證其爲模板中的第一個模板標記。 否則,模板繼承將不起作用。
-
一般來說,基礎模板中的 {% block %} 標籤越多越好。 記住,子模板不必定義父模板中所有的代碼塊,因此你可以用合理的缺省值對一些代碼塊進行填充,然後只對子模板所需的代碼塊進行(重)定義。
-
如果發覺自己在多個模板之間拷貝代碼,你應該考慮將該代碼段放置到父模板的某個 {% block %} 中。
如果你需要訪問父模板中的塊的內容,使用 {{ block.super }}這個標籤吧,這一個魔法變量將會表現出父模板中的內容。 如果只想在上級代碼塊基礎上添加內容,而不是全部重載,該變量就顯得非常有用了。 -
不允許在同一個模板中定義多個同名的 {% block %} 。 存在這樣的限制是因爲block 標籤的工作方式是雙向的。
也就是說,block 標籤不僅挖了一個要填的坑,也定義了在父模板中這個坑所填充的內容。如果模板中出現了兩個相同名稱的 {% block %} 標籤,父模板將無從得知要使用哪個塊的內容。