天天看點

django模闆系統(上)

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中代碼:

django模闆系統(上)
django模闆系統(上)
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的值