Django--模板語言

一.變量

變量看起來就像這樣{{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>

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章