1. 程式人生 > >django模板系統(上)

django模板系統(上)

字符數 長度 註意 csrf 字典 img arp elif 定義

filters    過濾
default    替代作用
filesizeformat    格式化為人類可讀
add    給變量加參數
lower    小寫
upper    大寫
title    標題
ljust    左對齊
rjust    右對齊
center    居中
length    返回value的長度
slice    切片
first    取第一個元素
last    取最後一個元素
join  字符串拼接
truncatechars    截斷
date    日期格式化
safe    標簽轉義
自定義filter
Tags
for    for循環可用的一些參數
for ... empty
if ,elif 和 else
with    定義一個中間變量
csrf_token

常用語法

Django模板中只需要記兩種特殊符號

{{ }} 和 {% %}

{{ }} 表示變量,在模板渲染的時候替換成值,{% %} 表示邏輯相關的操作

變量

{{ 變量名 }}

變量名由字母數字和下劃線組成。

點(.)在模板中有特殊的含義,用來獲取對象的響應屬性值。

view中代碼:

技術分享圖片
def template_test(request):
    l = [11, 22, 33]
    d = {"name": "alex"}

    class Person(object):
        def __init__(self, name, age):
            self.name 
= name self.age = age def dream(self): return "{} is dream...".format(self.name) Alex = Person(name="Alex", age=34) Egon = Person(name="Egon", age=9000) Eva_J = Person(name="Eva_J", age=18) person_list = [Alex, Egon, Eva_J] return render(request, "
template_test.html", {"l": l, "d": d, "person_list": person_list})
View Code

模板中支持的寫法:

{# 取l中的第一個參數 #}
{{ l.0 }}
{# 取字典中key的值 #}
{{ d.name }}
{# 取對象的name屬性 #}
{{ person_list.0.name }}
{# .操作只能調用不帶參數的方法 #}
{{ person_list.0.dream }}

註:當模板系統遇到一個(.)時,會按照如下的順序去查詢:

  1. 在字典中查詢

  2. 屬性或者方法

  3. 數字索引

Filters

翻譯為過濾器,用來修改變量的顯示結果

語法:{{ value|filter_name:參數 }}

“ | 左右沒有空格!沒有空格!!”

default

{{ value|default:"nothing" }}

如果value值沒傳的話就顯示nothing

註:TEMPLATES的OPTIONS可以增加一個選項:string_if_invalid:‘找不到‘,可以替代default的作用。

filesizeformat

將值格式話為一個“人類可讀的”文件尺寸(例如“13KB”,“4.1MB”,等等)。例如

{{ value|filesizeformat }}

如果value是123456789,輸出的將會是117.7MB。

add

給變量加參數

{{ value|add:"2" }}

value是數字4,則輸出結果為6.

{{ first|add:second }}

如果first是【1,2,3】,second【4,5,6】,那輸出結果是【1,2,3,4,5,6】。

lower

小寫

{{ value|lower }}

upper

大寫

{{ value|upper }}

title

標題

{{value|title}}

ljust

左對齊

"{{value|ljust:"10"}}"

rjust

右對齊

"{{value|rjust:"10"}}"

center

居中

"{{value|center:"15"}}"

length

{{ value|length }}

返回value的長度,如value=[ ‘a‘ , ‘b‘ , ‘c‘ , ‘d‘ ]的話,就顯示4

slice

切片

{{value|slice:"2:-1"}}

first

取第一個元素

{{value|first}}

last

取最後一個元素

{{value|last}}

join

使用字符串拼接列表。同python的str.join(list)。

{{value|join:" // "}}

truncatechars

如果字符串字符多於指定的字符數量,那麽會被截斷。截斷的字符串將以可翻譯的省略號序列(“.......”)結尾

參數:截斷的字符數

{{value|truncatechars:9}}

date

日期格式化

{{value|date:"Y-m-d H:i:s"}}

個可視化輸出的字符:點擊查看

safe

Django的模板中會對HTML標簽和JS等語法標簽進行轉義,原因顯而易見,這樣是為了安全。但是有的時候我們可能不希望這些HTML元素被轉義,比如我們做一個內容管理系統,後臺添加的文章中是經過修飾的,這些修飾可能是通過一個類似於FCKeditor編輯加註了HTML修飾符的文本,如果自動轉義的話顯示的就是保護HTML標簽的源文件。為了在django中關閉HTML的自動轉義有兩種方式,如果是一個單獨的變量我們可以通過過濾器“|safe”的方式告訴django這段代碼是安全的不必轉義。

比如:

value="<a href=‘#‘>點我</a>"

{{value|safe}}

自定義filter

自定義過濾器只是帶有一個或兩個參數的python函數:

  * 變量(輸入)的值 --- 不一定是一個字符串

  * 參數的值 --- 這可以有一個默認值,或完全省略

例如,在過濾器{{ var|foo: ‘bar‘ }} 中,過濾器foo將傳遞變量var和參數“bar

自定義filter代碼文件擺放位置:

app01/
    __init__.py
    models.py
    templatetags/  # 在app01下面新建一個package package
        __init__.py
        app01_filters.py  # 建一個存放自定義filter的py文件
    views.py

編寫自定義filter

from django import template
register = template.Library()


@register.filter
def fill(value, arg):
    return value.replace(" ", arg)


@register.filter(name="addSB")
def add_sb(value):
    return "{} SB".format(value)

使用自定義filter

{# 先導入我們自定義filter那個文件 #}
{% load app01_filters %}

{# 使用我們自定義的filter #}
{{ somevariable|fill:"__" }}
{{ d.name|addSB }}

Tags

for

<ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% endfor %}
</ul>

for循環可用的一些參數:

Variable Description
for loop.counter 當前循環的索引值(從1開始)
foo loop.counter 0 當前循環的索引值(從0開始)
for loop.revcounter 當前循環的倒序索引值(從1開始)
for loop.revcounter 0 當前循環的倒序索引值(從0開始)
for loop.first 當前循環是不是第一次循環(布爾值)
for loop.last 當前循環是不是最後一次循環(布爾值)
for loop.parentloop 本層循環的外層循環

for ... empty

<ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% empty %}
    <li>空空如也</li>
{% endfor %}
</ul>

if,elif 和 else

{% if user_list %}
  用戶人數:{{ user_list|length }}
{% elif black_list %}
  黑名單數:{{ black_list|length }}
{% else %}
  沒有用戶
{% endif %}

當然也可以只有if 和 else

{% if user_list|length > 5 %}
  七座豪華SUV
{% else %}
    黃包車
{% endif %}

if語句支持and,or,==,>,<,!=,<=,>=,in,not in,is,is not 判斷

with

定義一個中間變量

{% with total=business.employees.count %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}

csrf_token

這個標簽用於跨站請求偽造保護

在頁面的from表單裏面寫上{% csrf_token %}

註釋

# ... #

註意事項

1.Django的模板語言不支持連續判斷,即不支持以下寫法

{% if a >b >c %}
  ...
{% endif %}

2. Django的模板語言中屬性的優先級大於方法

def xx(request):
    d = {"a":1,"b":2,"c":3,"items":"100"}
    return render(request,"xx.html",{"data":d})

如上,我們在使用render方法渲染一個頁面的時候,傳的字典d有一個key是items並且還有默認的d.items()方法,此時在模板語言中:

{{data.items}}

默認會取d的items key的值

django模板系統(上)