-
1、提要
-
2、Filters
-
3、Tags
-
4、母版和繼承
-
5、組件的使用和注意事項
-
6、靜態路徑的寫法
1、提要:
1.官方文檔:
2.引入三種特殊符號:
變量相關的用
{{ }}
,邏輯相關的用
{% %}
,
點
(
.
)在模板語言中有特殊的含義,用來獲取對象的相應屬性值
。
3.模板中支持的寫法:
{# 取list中的第一個參數 #}
{{ list.0 }}
{# 取字典中key的值 #}
{{ d.name }}
{# 取對象的name屬性 #}
{{ person_list.0.name }}
2、Filters
語法: {{ value|filter_name:參數 }}
1.defalut:
{{ value|default: "nothing"}}
若是value值沒傳的話就顯示nothing
2.length:
{{ value|length }}
返回value的長度,如 value=['a', 'b', 'c', 'd']的話,就顯示4.
3.filesizeformat:
{{ value|filesizeformat }}
將值格式化爲一個 「人類可讀的」 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等)。若是 value 是 123456789,輸出將會是 117.7 MB。
4.slice
{{value|slice:"2:-1"}}
切片
5.data:
{{ value|date:"Y-m-d H:i:s"}}
格式化
6.safe:
Django的模板中會對HTML標籤和JS等語法標籤進行自動轉義,緣由顯而易見,這樣是爲了安全。可是有的時候咱們可能不但願這些HTML元素被轉義,好比咱們作一個內容管理系統,後臺添加的文章中是通過修飾的,這些修飾多是經過一個相似於FCKeditor編輯加註了HTML修飾符的文本,若是自動轉義的話顯示的就是保護HTML標籤的源文件。爲了在Django中關閉HTML的自動轉義有兩種方式,若是是一個單獨的變量咱們能夠經過過濾器「|safe」的方式告訴Django這段代碼是安全的沒必要轉義。
下面只會顯示點我
value = "<a href='#'>點我</a>"
{{ value|safe}}
7.truncatechars:
{{ value|truncatechars:9}}
參數:截斷的字符數
若是字符串字符多於指定的字符數量,那麼會被截斷。截斷的字符串將以可翻譯的省略號序列(「...」)結尾。
8.自定義filter:
a.自定義filter代碼文件擺放位置:
app01/
__init__.py
models.py
templatetags/
# 在app01下面新建一個templatetags文件
__init__.py 若是沒有這個就手動建立
app01_filters.py # 建一個存放自定義filter的文件,名字隨意
views.py
b.
編寫自定義filter
from django import template
#生成一個註冊用的實例
register = template.Library()
定義並註冊一個自定義的filter函數
@register.filter(name="cut")
def cut(value, arg):
return value.replace(arg, "")
@register.filter(name="addSB")
def add_sb(value):
return "{} SB".format(value)
c.
使用自定義filter
{# 先導入咱們自定義filter那個文件 #}
{% load app01_filters %}
{# 使用咱們自定義的filter #}
{{ somevariable|cut:"0" }}
{{ d.name|addSB }}
3、Tags
1.for:
<ul>
{% for user in user_list %}
<li>{{ user.name }}</li>
{% endfor %}
</ul>
2.for循環可用的一些參數:
Variable
|
Description
|
forloop.counter
|
當前循環的索引值(從1開始)
|
forloop.counter0
|
當前循環的索引值(從0開始)
|
forloop.revcounter
|
當前循環的倒序索引值(從1開始)
|
forloop.revcounter0
|
當前循環的倒序索引值(從0開始)
|
forloop.first
|
當前循環是否是第一次循環(布爾值)
|
forloop.last
|
當前循環是否是最後一次循環(布爾值)
|
forloop.parentloop
|
本層循環的外層循環
|
另外,for循環也能夠寫入到class中,如:
<ul>
{% for name in name_list %}
<li class='{% if forloop.first %}'sb'{% endif %}'>{{ forloop.revcounter }}-{{ name }}</li>
{% endfor %}
</ul>
#這段代碼會把第一個的屬性變成sb
3.for...empty:
<ul>
{% for user in user_list %}
<li>{{ user.name }}</li>
{% empty %}
<li>空空如也</li>
{% endfor %}
</ul>
4.if..elif和else:
{% if user_list %}
用戶人數:{{ user_list|length }}
{% elif black_list %}
黑名單數:{{ black_list|length }}
{% else %}
沒有用戶
{% endif %}
{% if user_list|length > 5 %}
七座豪華SUV
{% else %}
黃包車
{% endif %}
5.with:
{% with total=business.employees.count %}
{{ total }} employee{{ total|pluralize }}
#在這裏能夠用total
{% endwith %}
#定義一箇中間變量,
4、母版和繼承
1.首先寫母版:
# base.html
<!DOCTYPE html>
<html>
<head>
<title>母版</title>
</head>
<body>
<div>
<p>母版內容</p>
<p>圖書管理系統</p>
</div>
<div>
{% block page-main %}
#這裏是要替換的地方
#其他的方法都會被繼承
{% endblock %}
</div>
</body>
</html>
2.而後是要繼承母版的子頁面:
# insert1.html
#繼承的母版
{% extends 'base.html' %}
{% block page-main %}
<h3>我是書籍頁頁面的自定義內容1,用來替換母版中指定的位置</h3>
#這裏的內容會被替換到母版中
{% endblock %}
3.關於母版中幾個列表的切換問題的解決方法:
<li
{% if publisher_list %} class='active' {% endif %}><a href="/publisher_list/">出版社列表</a></li>
<li {% if all_book %}
class='active' {% endif %}><a href="/book_list/">書籍列表</a></li>
<li {% if author_list %} class='active' {% endif %}><a href="/author_list/">做者列表</a></li>
或者:
<li
class="{% block publisehr_class %}{% endblock %}"><a href="/publisher_list/">出版社列表</a></li>
<li class="{% block book_class %}{% endblock %}"><a href="/book_list/">書籍列表</a></li>
<li class="{% block author_class %}{% endblock %}"><a href="/author_list/">做者列表</a></li>
5、組件的使用和注意事項
1.將使用次數多的組件提取出來,保存到xiaohei.html文件中;
2.在須要添加組件的地方,寫入這個:
{% include 'xiaohei.html' %}
6、關於靜態文件路徑的寫法
{% load static %}
<img src="{% static "images/hi.jpg" %}"/>
1.會去settings.py裏面查找靜態文件夾的別名,幫你拼接具體的靜態文件的路徑
2.某個文件多處被用到能夠存爲一個變量
{% load static %}
{% static "images/hi.jpg" as myphoto %}
<img src="{{ myphoto }}"></img>
3.使用get_static_prefix本身拼接路徑:
{% load static %}
<img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />
或者:
{% load static %}
{% get_static_prefix as STATIC_PREFIX %}
<img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!" /><img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!" />
4.自定義simpletag:
a.自定義filter代碼文件擺放位置:
app01/
__init__.py
models.py
templatetags/
# 在app01下面新建一個package package
__init__.py
mysimpletag.py # 建一個存放自定義simpletag的文件,名字隨意
views.py
b.
編寫自定義simpletag
from django import template
#生成一個註冊用的實例
register = template.Library()
@register.simple_tag(name='yimi')
def my_sum(arg1, arg2, arg3):
return '{} {} {}'.format(arg1, arg2, arg3)
c.
使用自定義simpletag
{# 先導入咱們自定義filter那個文件 #}
{% load mysimpletag%}
{# 使用咱們自定義的simpletag #}
{% yimi 'wangzhen' 'changjiang' '12314' %}
#傳入三個參數
5.inclusion_tag:
多用於返回html代碼片斷
實例:
templatetags/my_inclusion.py
from django import template
register = template.Library()
@register.inclusion_tag('result.html')
def show_results(n):
n = 1 if n < 1 else int(n)
data = ["第{}項".format(i) for i in range(1, n+1)]
return {"data": data}
templates/snippets/result.html
<ul>
{% for choice in data %}
<li>{{ choice }}</li>
{% endfor %}
</ul>
templates/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="x-ua-compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>inclusion_tag test</title>
</head>
<body>
{% load inclusion_tag_test %}
{% show_results 10 %}
</body>
</html>