Django 模板 template


組成:HTML代碼+邏輯控制代碼

邏輯控制代碼的組成

1、變量  {{  var_name }}

深度變量的查找:萬能的句點號

#最好是用幾個例子來說明一下。
# 首先,句點可用於訪問列表索引,例如:

>>> from django.template import Template, Context
>>> t = Template('Item 2 is {{ items.2 }}.')
>>> c = Context({'items': ['apples', 'bananas', 'carrots']})
>>> t.render(c)
'Item 2 is carrots.'

#假設你要向模板傳遞一個 Python 字典。 要通過字典鍵訪問該字典的值,可使用一個句點:
>>> from django.template import Template, Context
>>> person = {'name': 'Sally', 'age': '43'}
>>> t = Template('{{ person.name }} is {{ person.age }} years old.')
>>> c = Context({'person': person})
>>> t.render(c)
'Sally is 43 years old.'

#同樣,也可以通過句點來訪問對象的屬性。 比方說, Python 的 datetime.date 對象有
#year 、 month 和 day 幾個屬性,你同樣可以在模板中使用句點來訪問這些屬性:

>>> from django.template import Template, Context
>>> import datetime
>>> d = datetime.date(1993, 5, 2)
>>> d.year
>>> d.month
>>> d.day
>>> t = Template('The month is {{ date.month }} and the year is {{ date.year }}.')
>>> c = Context({'date': d})
>>> t.render(c)
'The month is 5 and the year is 1993.'

# 這個例子使用了一個自定義的類,演示了通過實例變量加一點(dots)來訪問它的屬性,這個方法適
# 用於任意的對象。
>>> from django.template import Template, Context
>>> class Person(object):
...     def __init__(self, first_name, last_name):
...         self.first_name, self.last_name = first_name, last_name
>>> t = Template('Hello, {{ person.first_name }} {{ person.last_name }}.')
>>> c = Context({'person': Person('John', 'Smith')})
>>> t.render(c)
'Hello, John Smith.'

# 點語法也可以用來引用對象的方法。 例如,每個 Python 字符串都有 upper() 和 isdigit()
# 方法,你在模板中可以使用同樣的句點語法來調用它們:
>>> from django.template import Template, Context
>>> t = Template('{{ var }} -- {{ var.upper }} -- {{ var.isdigit }}')
>>> t.render(Context({'var': 'hello'}))
'hello -- HELLO -- False'
>>> t.render(Context({'var': '123'}))
'123 -- 123 -- True'

# 注意這里調用方法時並沒有使用圓括號 而且也無法給該方法傳遞參數;你只能調用不需參數的方法。

變量的過濾器  {{obj|filter:param}}

(1)add

        使用形式為:{{ value | add: "2"}}
        意義:將value的值增加2
  • 1
  • 2
  • 3

(2)addslashes

        使用形式為:{{ value | addslashes }}
        意義:在value中的引號前增加反斜線
  • 1
  • 2
  • 3

(3)capfirst

        使用形式為:{{ value | capfirst }}
        意義:value的第一個字符轉化成大寫形式
  • 1
  • 2
  • 3

(4)cut

         使用形式為:{{ value | cut:arg}}, 例如,如果value是“String with spaces” arg是" "那么輸出是"Stringwithspaces"
         意義:從給定value中刪除所有arg的值
  • 1
  • 2
  • 3

(5)date

         使用形式為::
             (a) {{ value | date:"D d M Y" }},例如,如果value是一個datetime對象(datetime.datetime.now())那么輸出將是字符串"Wed 09 Jan 2008"
             (b) {{ value | date }},這種形式沒有格式化字符串,這時候,格式化字符串會自動采用DATE_FORMAT所設置的形式。
         意義:將日期格式數據按照給定的格式輸出
  • 1
  • 2
  • 3
  • 4
  • 5

(6)default

         使用形式:{{ value | default: "nothing" }},例如,如果value是“”,那么輸出將是nothing
         意義:如果value的意義是False,那么輸出使用缺省值
  • 1
  • 2
  • 3

(7)default_if_none

         使用形式:{{ value | default_if_none:"nothing" }},例如,如果value是None,那么輸出將是nothing
         意義:如果value是None,那么輸出將使用缺省值
  • 1
  • 2
  • 3

(8)dictsort

         意義:如果value的值是一個字典,那么返回值是按照關鍵字排序的結果
         使用形式:{{ value | dictsort:"name"}},例如,
         如果value是:
  • 1
  • 2
  • 3
  • 4


{‘name’: ‘zed’, ‘age’: 19}, 
{‘name’: ‘amy’, ‘age’: 22}, 
{‘name’: ‘joe’, ‘age’: 31}, 

那么,輸出是: 

{‘name’: ‘amy’, ‘age’: 22}, 
{‘name’: ‘joe’, ‘age’: 31}, 
{‘name’: ‘zed’, ‘age’: 19}, 
]

(9)dictsortreversed

意義:如果value的值是一個字典,那么返回值是按照關鍵字排序的結果的反序 
使用形式:與上述(8)完全相同。

(10)divisibleby

使用形式:{{ value | divisibleby:arg}},如果value是21,arg是3,那么輸出將是True 
意義:如果value能夠被arg整除,那么返回值將是True

(11)escape

使用形式:{{ value | escape}} 
意義:替換value中的某些字符,以適應HTML格式,包括: 
< is converted to &lt; 
> is converted to &gt; 
’ (single quote) is converted to &#39; 
” (double quote) is converted to &quot; 
& is converted to &amp;

escape僅僅在輸出的時候才起作用,所以escape不能夠用在鏈式過濾器的中間, 
他應該總是最后一個過濾器,如果想在鏈式過濾器的中間使用,那么可以使用force_escape

(12)escapejs

使用形式:{{ value | escapejs }} 
意義:替換value中的某些字符,以適應JAVASCRIPT和JSON格式。

(13)filesizeformat

使用形式:{{ value | filesizeformat }} 
意義:格式化value,使其成為易讀的文件大小,例如:13KB,4.1MB等。

(14)first

使用形式:{{ value | first }} 
意義:返回列表中的第一個Item,例如,如果value是列表[‘a’,’b’,’c’],那么輸出將是’a’。

(15)floatformat

使用形式:{{ value | floatformat}}或者{{value|floatformat:arg}}, 
arg可以是正數也可以是負數。沒有參數的floatformat相當於floatformat:-1 
(1)如果不帶arg,那么引擎會四舍五入,同時最多只保留一位小數。

34.23234 {{ value|floatformat }} 34.2 
34.00000 {{ value|floatformat }} 34 
34.26000 {{ value|floatformat }} 34.3

(2)如果arg是正數,那么引擎會四舍五入,同時保留arg位的小數。

34.23234 {{ value|floatformat:3 }} 34.232 
34.00000 {{ value|floatformat:3 }} 34.000 
34.26000 {{ value|floatformat:3 }} 34.260

(3)如果arg是負數,那么引擎會四舍五入,如果有小數部分,那么保留arg位小數;否則,則沒有任何小數部分。

34.23234 {{ value|floatformat:”-3” }} 34.232 
34.00000 {{ value|floatformat:”-3” }} 34 
34.26000 {{ value|floatformat:”-3” }} 34.26

(16)get_digit

使用形式:{{ value | get_digit:”arg”}},例如,如果value是123456789,arg是2,那么輸出是8 
意義:給定一個數字,返回,請求的數字,記住:1代表最右邊的數字,如果value不是合法輸入, 
那么會返回所有原有值。

(17)iriencode

使用形式:{{value | iriencode}} 
意義:如果value中有非ASCII字符,那么將其進行抓化成URL中適合的編碼,如果value已經進行過URLENCODE, 
改操作就不會再起作用。

(18)join

使用形式:{{ value | join:”arg”}},如果value是[‘a’,’b’,’c’],arg是’//’那么輸出是a//b//c 
意義:使用指定的字符串連接一個list,作用如同python的str.join(list)

(19)last

使用形式:{{ value | last }} 
意義:返回列表中的最后一個Item

(20)length

使用形式:{{ value | length }} 
意義:返回value的長度。

(21)length_is

使用形式:{{ value | length_is:”arg”}} 
意義:返回True,如果value的長度等於arg的時候,例如:如果value是[‘a’,’b’,’c’],arg是3,那么返回True

(22)linebreaks

使用形式:{{value|linebreaks}} 
意義:value中的”\n”將被<br/>替代,並且整個value使用</p>包圍起來,從而適和HTML的格式

(23)linebreaksbr

使用形式:{{value |linebreaksbr}} 
意義:value中的”\n”將被<br/>替代

(24)linenumbers

使用形式:{{value | linenumbers}} 
意義:顯示的文本,帶有行數。

(25)ljust

使用形式:{{value | ljust}} 
意義:在一個給定寬度的字段中,左對齊顯示value

(26)center

使用形式:{{value | center}} 
意義:在一個給定寬度的字段中,中心對齊顯示value

(27)rjust

使用形式:{{value | rjust}} 
意義:在一個給定寬度的字段中,右對齊顯示value

(28)lower

使用形式:{{value | lower}} 
意義:將一個字符串轉換成小寫形式

(29)make_list

使用形式:{{value | make_list}} 
意義:將value轉換成一個list,對於字符串,轉換成字符list;對於整數,轉換成整數list 
例如value是Joel,那么輸出將是[u’J’,u’o’,u’e’,u’l’];value是123,那么輸出將是[1,2,3]

(30)pluralize

使用形式:{{value | pluralize}},或者{{value | pluralize:”es”}},或者{{value | pluralize:”y,ies”}} 
意義:如果value不是1,則返回一個復數后綴,缺省的后綴是’s’

(31)random

使用形式:{{value | random}} 
意義:從給定的list中返回一個任意的Item

(32)removetags

使用形式:{{value | removetags:”tag1 tag2 tag3…”}} 
意義:刪除value中tag1,tag2….的標簽。例如,如果value是<b>Joel</b> <button>is</button> a <span>slug</span> 
tags是”b span”,那么輸出將是:Joel <button>is</button> a slug

(33)safe

使用形式:{{value | safe}} 
意義:當系統設置autoescaping打開的時候,該過濾器使得輸出不進行escape轉換

(34)safeseq

與上述safe基本相同,但有一點不同的就是:safe是針對字符串,而safeseq是針對多個字符串組成的sequence

(35)slice

使用形式:{{some_list | slice:”:2”}} 
意義:與python語法中的slice相同,:2表示第一的第二個元素

(36)slugify

使用形式:{{value | slugify}} 
意義:將value轉換成小寫形式,同事刪除所有分單詞字符,並將空格變成橫線 
例如:如果value是Joel is a slug,那么輸出將是joel-is-a-slug

(37)stringformat

這個不經常用,先不說 
{{ value|stringformat:”E” }} 
If value is 10, the output will be 1.000000E+01.

(38)striptags

使用形式:{{value | striptags}} 
意義:刪除value中的所有HTML標簽

(39)time

使用形式:{{value | time:”H:i”}}或者{{value | time}} 
意義:格式化時間輸出,如果time后面沒有格式化參數,那么輸出按照TIME_FORMAT中設置的進行。

(40)title

轉換一個字符串成為title格式。

(41)truncatewords

使用形式:{{value | truncatewords:2}} 
意義:將value切成truncatewords指定的單詞數目 
例如,如果value是Joel is a slug 那么輸出將是:Joel is …

(42)truncatewords_html

使用形式同(41) 
意義:truncation點之前如果某個標簽打開了,但是沒有關閉,那么在truncation點會立即關閉。 
因為這個操作的效率比truncatewords低,所有只有在value是html格式時,才考慮使用。

(43)upper

轉換一個字符串為大寫形式

(44)urlencode

將一個字符串進行URLEncode

(45)urlize

意義:將一個字符串中的URL轉化成可點擊的形式。 
使用形式:{{ value | urlize }} 
例如,如果value是Check out www.djangoproject.com,那么輸出將是: 
Check out <a href=”http://www.djangoproject.com”>www.djangoproject.com</a>

(46)urlizetrunc

使用形式:{{ value | urlizetrunc:15}} 
意義:與(45)相同,但是有一點不同就是現實的鏈接字符會被truncate成特定的長度,后面以…現實。

(47)wordcount

返回字符串中單詞的數目

(48)wordwrap

使用形式:{{value | wordwrap:5}} 
意義:按照指定的長度包裝字符串 
例如,如果value是Joel is a slug,那么輸出將會是: 
Joel 
is a 
slug

(49)timesince

使用形式:{{value | 
since:arg}} 
意義:返回參數arg到value的天數和小時數 
例如,如果 blog_date 是一個日期實例表示 2006-06-01 午夜, 而 comment_date 是一個日期實例表示 2006-06-01 早上8點, 
那么 {{ comment_date|timesince:blog_date }} 將返回 “8 hours”.

(50)timeuntil

使用形式:{{value | timeuntil}} 
意義:與(50)基本相同,一個不同點就是,返回的是value距離當前日期的天數和小時數。

#實例:

#value1="aBcDe"
{{ value1|upper }}<br>  ABCDE

#value2=5
{{ value2|add:3 }}<br>  8

#value3='he  llo wo r ld'
{{ value3|cut:' ' }}<br>  helloworld

#import datetime
#value4=datetime.datetime.now()
{{ value4|date:'Y-m-d' }}<br>  2018-05-11

#value5=[]
{{ value5|default:'空的' }}<br>  空的 # 如果前面的值為空,則顯示default中的內容

#value6='<a href="#">跳轉</a>'

{{ value6 }}  # 前端顯示<a href='#'>跳轉</a> 這是一種安全機制

{% autoescape off %}   # 范圍取消安全機制
  {{ value6 }}      # 這會顯示正常的a標簽
{% endautoescape %}

{{ value6|safe }}<br>  # 與上面的方法一樣,不是范圍而已

{{ value6|striptags }}  跳轉 # 取消所有html標簽

#value7='1234'
{{ value7|first }}<br>  1  # 取第一個
{{ value7|length }}<br>  4  # 取長度
{{ value7|slice:":-1" }}<br>  4321 # 切片 

#value8='http://www.baidu.com/?a=1&b=3'
{{ value8|urlencode }}<br>

# value = 'CPTTTTTTTTTTTT'
 
         
{{ value|truncatechars: 3  }}     # 那么輸出的時候,會輸出'CPT'
 
        

2、標簽  {%  tag %}

(1)    {%if 條件%}

    執行的代碼

   {%elif 條件%}

    執行的代碼

   {%else%}

    執行的代碼

   {%endif%}

(2)  {%for 變量 in 對象%}    {%for 變量 in 對象 reversed%} : 同樣,{% for %}模板標簽也可使用reversed反向迭代列表

         循環的代碼

  {%empty%}

    為空時的代碼

  {%endfor%}

  #系統不支持中斷循環,系統也不支持continue語句,{% for %}標簽內置了一個forloop模板變量,

#這個變量含有一些屬性可以提供給你一些關於循環的信息 

  1,forloop.counter表示循環的次數,它從1開始計數,第一次循環設為1: {% for item in todo_list %} <p>{{ forloop.counter }}: {{ item }}</p> {% endfor %}   2,forloop.counter0 類似於forloop.counter,但它是從0開始計數,第一次循環設為0   3,forloop.revcounter  將forloo9p的值倒過來   4,forloop.revcounter0 類似於forloop.reccouter,最后一次循環設為0   5,forloop.first當第一次循環時值為True,在特別情況下很有用: {% for object in objects %} {% if forloop.first %}<li class="first">{% else %}<li>{% endif %} {{ object }} </li> {% endfor %}   # 富有魔力的forloop變量只能在循環中得到,當模板解析器到達{% endfor %}時forloop就消失了   # 如果你的模板context已經包含一個叫forloop的變量,Django會用{% for %}標簽替代它   # Django會在for標簽的塊中覆蓋你定義的forloop變量的值   # 在其他非循環的地方,你的forloop變量仍然可用

(3) {%csrf_token%} (post提交時生效)

 

用於生成csrf_token的標簽,用於防治跨站攻擊驗證。注意如果你在view的index里用的是render_to_response方法,不會生效

     其實,這里是會生成一個input標簽,和其他表單標簽一起提交給后台的。

 

(4){% url %}:  引用路由配置的地址別名(參考urls.py)

(5){% with %}:用更簡單的變量名替代復雜的變量名

with total=fhjsaldfhjsdfhlasdfhljsdal %} {{ total }} {% endwith %}  # 使用total變量名代替fhjsaldfhjsdfhlasdfhljsdal變量名

(6){% verbatim %}: 禁止render

{% verbatim %}
          {{ hello }}    # 頁面直接顯示{{ hello }}
{% endverbatim %}

 (7) {% load %}: 加載標簽庫 

{% load staticfiles %} 加載靜態文件
{% load xxx %} 加載自定義的filter
自定義filter和tag
1、
在app中創建名稱為templatetags的包(必須的)
2、在里面創建任意 .py 文件,如:my_tags.py
3、寫my_tags.pyfrom django import template
from django.utils.safestring import mark_safe

register = template.Library()   #register的名字是固定的,不可改變


@register.filter  # 自定義的filter
def filter_multi(v1,v2):
    return  v1 * v2      


@register.simple_tag  # 自定義的tag
def simple_tag_multi(v1,v2):
    return  v1 * v2


@register.simple_tag  # 自定義的tag
def my_input(id,arg):
    result = "<input type='text' id='%s' class='%s' />" %(id,arg,)
    return mark_safe(result)

4、在模板中調用自己寫的filter

{% load my_tags%}
 # num=12

{{ num|filter_multi:2 }} #24 {{ num|filter_multi:"[22,333,4444]" }} {% simple_tag_multi 2 5 %} 參數不限,但不能放在if for語句中 {% simple_tag_multi num 5 %}

# filter可以用在if等語句后,simple_tag不可以

注意:在settings中的INSTALLED_APPS配置當前app,不然django無法找到自定義的simple_tag.

 

3、 {% include %} 

該標簽允許在(模板中)包含其它的模板的內容。 標簽的參數是所要包含的模板名稱,可以是一個變量,也可以是用單/雙引號硬編碼的字符串。 每當在多個模板中出現相同的代碼時,就應該考慮是否要使用 {% include %} 來減少重復。

{% include 'test.html' %}

 

4、模板的繼承

第一步是定義 基礎模板,該框架之后將由子模板所繼承。 以下是我們目前所講述范例的基礎模板:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
<title>{% block title %}{% endblock %}</title>
</head>
<body>
<h1>My helpful timestamp site</h1>
{% block content %}{% endblock %}
{% block footer %}
<hr>
<p>Thanks for visiting my site.</p>
{% endblock %}
</body>
</html>


復制代碼
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<html lang="en">
<head>
    <title>{% block title %}{% endblock %}</title>
</head>
<body>
    <h1>My helpful timestamp site</h1>
    {% block content %}{% endblock %}
    {% block footer %}
    <hr>
    <p>Thanks for visiting my site.</p>
    {% endblock %}
</body>
</html>
復制代碼

這個叫做 base.html 的模板定義了一個簡單的 HTML 框架文檔,我們將在本站點的所有頁面中使用。 子模板的作用就是重載、添加或保留那些塊的內容。 (如果你一直按順序學習到這里,保存這個文件到你的template目錄下,命名為 base.html .)

我們使用模板標簽: {% block %} 。 所有的 {% block %} 標簽告訴模板引擎,子模板可以重載這些部分。 每個{% block %}標簽所要做的是告訴模板引擎,該模板下的這一塊內容將有可能被子模板覆蓋。

現在我們已經有了一個基本模板,我們可以修改 current_datetime.html 模板來 使用它:

{% extends "base.html" %}
 
{% block title %}The current time{% endblock %}
 
{% block content %}
<p>It is now {{ current_date }}.</p>
{% endblock %}

復制代碼
{% extends "base.html" %}
 
{% block title %}The current time{% endblock %}
 
{% block content %}
<p>It is now {{ current_date }}.</p>
{% endblock %}
復制代碼

再為 hours_ahead 視圖創建一個模板,看起來是這樣的:

{% extends "base.html" %}
 
{% block title %}Future time{% endblock %}
 
{% block content %}
<p>In {{ hour_offset }} hour(s), it will be {{ next_time }}.</p>
{% endblock %}

復制代碼
{% extends "base.html" %}
 
{% block title %}Future time{% endblock %}
 
{% block content %}
<p>In {{ hour_offset }} hour(s), it will be {{ next_time }}.</p>
{% endblock %}
復制代碼

看起來很漂亮是不是? 每個模板只包含對自己而言 獨一無二 的代碼。 無需多余的部分。 如果想進行站點級的設計修改,僅需修改 base.html ,所有其它模板會立即反映出所作修改。

<1>如果在模板中使用 {% extends %} ,必須保證其為模板中的第一個模板標記。 否則,模板繼承將不起作用。

<2>一般來說,基礎模板中的 {% block %} 標簽越多越好。 記住,子模板不必定義父模板中所有的代碼塊,因此 你可以用合理的缺省值對一些代碼塊進行填充,然后只對子模板所需的代碼塊進行(重)定義。 俗話說,鈎子越 多越好。

<3>如果發覺自己在多個模板之間拷貝代碼,你應該考慮將該代碼段放置到父模板的某個 {% block %} 中。 如果你需要訪問父模板中的塊的內容,使用 {{ block.super }}這個標簽吧,這一個魔法變量將會表現出父模 板中的內容。 如果只想在上級代碼塊基礎上添加內容,而不是全部重載,該變量就顯得非常有用了。

<4>不允許在同一個模板中定義多個同名的 {% block %} 。 存在這樣的限制是因為block 標簽的工作方式是雙向的。 也就是說,block 標簽不僅挖了一個要填的坑,也定義了在父模板中這個坑所填充的內容。如果模板中出現了兩個 相同名稱的 {% block %} 標簽,父模板將無從得知要使用哪個塊的內容。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM