一.變量
變量看起來就像這樣{{variable}}
當模板引擎遇到一個變量,它將從上下文context中獲取這個變量的值,然後用值替換掉它本身
變量的命名包括任何字母數字以及下劃線('_')的組合.點('.')也有可能會在變量名中出現,不過它有特殊的含義.最重要的是變量名中不能有空格或標點符號
當模板系統遇到('.')它將以這樣的順序查詢這個圓點具體代表的功能:
- 字典查詢
- 屬性或方法查詢
- 數字索引查詢
如果你使用的變量名不存在,模板系統將插入string_if_invalid選項的值,默認設置爲空字符串
注意,像{{ foo.bar }}
這種模版表達式中的“bar”,如果在模版上下文中存在,將解釋爲一個字面意義的字符串而不是使用變量bar的值 。
二.過濾器
過濾器看起來是這樣的{{name|lower}} 使用管道符號(|)來應用過濾器.該過濾器將文本轉換成小寫
過濾器可以“鏈接”。一個過濾器的輸出應用於下一個過濾器。例如:{{ text|escape|linebreaks }}
就是一個常用的過濾器鏈,它首先轉移文本內容,然後把文本行轉成<p>
標籤。
1.default
爲false或者爲空變量提供默認值
{{ value|default:"nothing" }}
2.length
返回值的長度,他對字符串的和列表都起作用
{{ value|length }}
3.filesizeformat
格式爲'人類可讀' 文件大小單位
{{ value|filesizeformat }}
三.標籤
1.for 循環標籤
循環對象中每個元素。需要結束標籤{% endfor %}
。例如,顯示athlete_list
中提供的運動員列表
<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}
</ul
2.if,elif,else標籤
計算一個表達式,並且當表達式得值是TRUE時,顯示塊中的內容.需要{%endif%}結束標籤 整體邏輯非常累是python的if elif else
{% if athlete_list %}
Number of athletes: {{ athlete_list|length }}
{% elif athlete_in_locker_room_list %}
Athletes should be out of the locker room soon!
{% else %}
No athletes.
{% endif %}
3.block和extends標籤
繼承和複寫模板
四.註釋
要註釋模版中一行的部分內容,使用註釋語法:{# #}
。
五.模板繼承
Django模版引擎中最強大也是最複雜的部分就是模版繼承了。模版繼承允許你創建一個包含基本“骨架”的父親模版,它包含站點中的共有元素,並且可以定義能夠被子模版覆蓋的blocks。
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="style.css" />
<title>{% block title %}My amazing site{% endblock %}</title>
</head>
<body>
<div id="sidebar">
{% block sidebar %}
<ul>
<li><a href="/">Home</a></li>
<li><a href="/blog/">Blog</a></li>
</ul>
{% endblock %}
</div>
<div id="content">
{% block content %}{% endblock %}
</div>
</body>
</html>
這個模版,通常被命名爲base.html
,它定義了一個可以用於兩列排版頁面的簡單HTML骨架。
“子模版”需要做的是先繼承父模板base.html
,然後複寫、填充,或者說實現其中的blocks。
block是在子模版中可能會被覆蓋掉的位置。在上面的例子中,block標籤定義了三個可以被子模版內容填充的block,分別是title、content和siderb
再看下面的例子,子模版可能看起來是這樣的:
{% extends "base.html" %}
{% block title %}My amazing blog{% endblock %}
{% block content %}
{% for entry in blog_entries %}
<h2>{{ entry.title }}</h2>
<p>{{ entry.body }}</p>
{% endfor %}
{% endblock %}
extends標籤是這裏的關鍵。它告訴模版引擎,這個模版“繼承”了另一個模版。當模版系統處理這個模版時,首先會去加載父模版,也就是“base.html”。
加載過程中,模版引擎將注意到base.html
中的三個block標籤,並用子模版中的內容來替換這些block。 根據blog_entries
的值,最終輸出可能看起來是這樣的
8. 圖片驗證碼
9. session會話
10. 註冊視圖
11.使用Django發送郵件
12. 郵件註冊確認
13. 使用Github管理項目
實戰二:CMDB之資產管理系統
1.項目需求分析
2.模型設計
3.數據收集客戶端
4.Windows下收集數據
5.Linux下收集數據
6.新資產待審批區
7.審批新資產
8.已上線資產信息更新
9.前端框架AdminLTE
10.資產總表
11.資產詳細頁面
12.dashboard儀表盤
Django模板語言詳解
閱讀: 5985
本節將介紹Django模版系統的語法。Django模版語言致力於在性能和簡單性上取得平衡。
如果你有過其它編程背景,或者使用過一些在HTML中直接混入程序代碼的語言,那麼你需要記住,Django的模版系統並不是簡單的將Python嵌入到HTML中。
一、模板
模版是純文本文件,可以生成任何基於文本的文件格式,比如HTML,XML,CSV等。
下面是一個小模版,它展示了一些基本的元素。
{% extends "base_generic.html" %}
{% block title %}{{ section.title }}{% endblock %}
{% block content %}
<h1>{{ section.title }}</h1>
{% for story in story_list %}
<h2>
<a href="{{ story.get_absolute_url }}">
{{ story.headline|upper }}
</a>
</h2>
<p>{{ story.tease|truncatewords:"100" }}</p>
{% endfor %}
{% endblock %}
二、變量
變量看起來就像是這樣: {{ variable }}。
當模版引擎遇到一個變量,它將從上下文context中獲取這個變量的值,然後用值替換掉它本身。
變量的命名包括任何字母數字以及下劃線("_")的組合。點(".")也有可能會在變量名中出現,不過它有特殊的含義。最重要的是,變量名稱中不能有空格或標點符號。
當模版系統遇到點("."),它將以這樣的順序查詢這個圓點具體代表的功能:
字典查詢(Dictionary lookup)
屬性或方法查詢(Attribute or method lookup)
數字索引查詢(Numeric index lookup)
如果你使用的變量不存在,模版系統將插入string_if_invalid選項的值,默認設置爲''(空字符串)。
注意,像{{ foo.bar }}這種模版表達式中的“bar”,如果在模版上下文中存在,將解釋爲一個字面意義的字符串而不是使用變量bar的值 。
三、過濾器
過濾器看起來是這樣的:{{ name|lower }}。使用管道符號(|)來應用過濾器。該過濾器將文本轉換成小寫。
過濾器可以“鏈接”。一個過濾器的輸出應用於下一個過濾器。例如:{{ text|escape|linebreaks }}就是一個常用的過濾器鏈,它首先轉移文本內容,然後把文本行轉成<p>標籤。
一些過濾器帶有參數。 過濾器的參數看起來像是這樣: {{ bio|truncatewords:30 }}。 這將顯示bio變量的前30個詞。
過濾器參數包含空格的話,必須用引號包起來。例如,使用逗號和空格去連接一個列表中的元素,你需要使用{{ list|join:", " }}。
Django提供了大約六十個內置的模版過濾器,很多時候你想要的功能,它都已經提供了,經常查看這些過濾器,發現新大陸吧。下面是一些常用的模版過濾器:
1. default
爲false或者空變量提供默認值,像這樣:
{{ value|default:"nothing" }}
2. length
返回值的長度。它對字符串和列表都起作用。
{{ value|length }}
如果value是['a', 'b', 'c', 'd'],那麼輸出4。
3. filesizeformat
格式化爲“人類可讀”文件大小單位(即'13 KB',4.1 MB','102 bytes'等)。
{{ value|filesizeformat }}
如果value是123456789,輸出將會是117.7MB。
我們可以創建自定義的模板過濾器和標籤,這是最終極的武器。
四、標籤
標籤看起來像是這樣的: {% tag %}。
標籤比變量複雜得多,有些用於在輸出中創建文本,有些用於控制循環或判斷邏輯,有些用於加載外部信息到模板中供以後的變量使用。
一些標籤需要開始和結束標籤(即 {% 標籤 %} ... 標籤 內容 ... {% ENDTAG %})。
Django自帶了大約24個內置的模版標籤。下面是一些常用的標籤:
1. for循環標籤
循環對象中每個元素。需要結束標籤{% endfor %} 。例如,顯示athlete_list中提供的運動員列表:
<ul>
{% for athlete in athlete_list %}
<li>{{ athlete.name }}</li>
{% endfor %}
</ul>
2. if,elif和else標籤
計算一個表達式,並且當表達式的值是“True”時,顯示塊中的內容。需要{% endif %}結束標籤。整體邏輯非常類似Python的if、elif和else,如下所示。:
{% if athlete_list %}
Number of athletes: {{ athlete_list|length }}
{% elif athlete_in_locker_room_list %}
Athletes should be out of the locker room soon!
{% else %}
No athletes.
{% endif %}
在上面的例子中,如果athlete_list不是空的,運動員的數量將顯示爲{{ athlete_list|length }}。否則,如果athlete_in_locker_room_list不爲空,將顯示“Athletes should be out…”。如果兩個列表都是空的,將顯示“No athletes.” 。
還可以在if標籤中使用過濾器和多種運算符:
{% if athlete_list|length > 1 %}
Team: {% for athlete in athlete_list %} ... {% endfor %}
{% else %}
Athlete: {{ athlete_list.0.name }}
{% endif %}
需要注意,大多數模版過濾器都返回字符串類型,所以使用過濾器做整數類型的比較通常是錯誤的,但length是一個例外。
3. block和extends標籤
繼承和複寫模版。類似Python的類繼承和重寫機制。
五、註釋
要註釋模版中一行的部分內容,使用註釋語法:{# #}。
例如,下面的模版將被渲染爲'hello':
{# greeting #}hello
註釋可以包含任何模版內的代碼,有效的或者無效的都可以。 像這樣:
{# {% if foo %}bar{% else %} #}
以上是單行註釋(在{# .... #}中,不允許有新行)。
如果需要註釋掉模版中的多行內容,請使用comment標籤。
六、模板繼承
Django模版引擎中最強大也是最複雜的部分就是模版繼承了。模版繼承允許你創建一個包含基本“骨架”的父親模版,它包含站點中的共有元素,並且可以定義能夠被子模版覆蓋的blocks。
通過下面這個例子,理解模版繼承的概念:
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="style.css" />
<title>{% block title %}My amazing site{% endblock %}</title>
</head>
<body>
<div id="sidebar">
{% block sidebar %}
<ul>
<li><a href="/">Home</a></li>
<li><a href="/blog/">Blog</a></li>
</ul>
{% endblock %}
</div>
<div id="content">
{% block content %}{% endblock %}
</div>
</body>
</html>
這個模版,通常被命名爲base.html,它定義了一個可以用於兩列排版頁面的簡單HTML骨架。
“子模版”需要做的是先繼承父模板base.html,然後複寫、填充,或者說實現其中的blocks。
block是在子模版中可能會被覆蓋掉的位置。在上面的例子中,block標籤定義了三個可以被子模版內容填充的block,分別是title、content和siderbar。
再看下面的例子,子模版可能看起來是這樣的:
{% extends "base.html" %}
{% block title %}My amazing blog{% endblock %}
{% block content %}
{% for entry in blog_entries %}
<h2>{{ entry.title }}</h2>
<p>{{ entry.body }}</p>
{% endfor %}
{% endblock %}
extends標籤是這裏的關鍵。它告訴模版引擎,這個模版“繼承”了另一個模版。當模版系統處理這個模版時,首先會去加載父模版,也就是“base.html”。
加載過程中,模版引擎將注意到base.html中的三個block標籤,並用子模版中的內容來替換這些block。 根據blog_entries的值,最終輸出可能看起來是這樣的:
<!DOCTYPE html>
<html lang="en">
<head>
<link rel="stylesheet" href="style.css" />
<title>My amazing blog</title>
</head>
<body>
<div id="sidebar">
<ul>
<li><a href="/">Home</a></li>
<li><a href="/blog/">Blog</a></li>
</ul>
</div>
<div id="content">
<h2>Entry one</h2>
<p>This is my first entry.</p>
<h2>Entry two</h2>
<p>This is my second entry.</p>
</div>
</body>
</html>