1. 程式人生 > >Django框架簡介及模板Template

Django框架簡介及模板Template

爸爸 特殊符號 html標簽 地址 [] slice ++ kong urn

Django框架簡介

MVC框架和MTV框架

MVC,全名是Model View Controller,是軟件工程中的一種軟件架構模式,把軟件系統分為三個基本部分:模型(Model)、視圖(View)和控制器(Controller),具有耦合性低、重用性高、生命周期成本低等優點。

技術分享圖片

想要更詳細的了解MVC模式? >> 點我

Django框架的設計模式借鑒了MVC框架的思想,也是分成三部分,來降低各個部分之間的耦合性。

Django框架的不同之處在於它拆分的三部分為:Model(模型)、Template(模板)和View(視圖),也就是MTV框架。

Django的MTV模式

Model(模型):負責業務對象與數據庫的對象(ORM)

Template(模版):負責如何把頁面展示給用戶

View(視圖):負責業務邏輯,並在適當的時候調用Model和Template

此外,Django還有一個urls分發器,它的作用是將一個個URL的頁面請求分發給不同的view處理,view再調用相應的Model和Template

Django框架圖示

技術分享圖片

Django模板系統

官方文檔

常用語法

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})
技術分享圖片 技術分享圖片

模板中支持的寫法:

技術分享圖片 技術分享圖片
{# 取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

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

{{ value|filesizeformat }}

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

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 }}
技術分享圖片 技術分享圖片

模板測試:

views.py

技術分享圖片
from django.shortcuts import render,HttpResponse,redirect
import datetime

# Create your views here.

def exp(request):
    lis = ["哈哈","嘿嘿","啦啦"]
    dic = {
        "name" : "郝旭",
        "age" : 21,
        "job" : "IT"
    }
    kong = []
    filesize = 2048
    a = 9
    lis1 = [1,2,3]
    lis2 = [4,5,6]
    b = "RISITANIANGA"
    string = "我是最棒的"
    long_str = "qwertyuiopasdfghjklzxcvbnm"
    data_now = datetime.datetime.now()
    # print(time.strftime("%Y-%m-%d %H:%M:%S"))
    class Person(object):
        def __init__(self,name,age,job):
            self.name = name
            self.age = age
            self.job = job
        def dream(self):
            return "{} is dream...".format(self.name)
        def __str__(self):
            return "{}".format(self.name)
        #python2中的方法:
        def __unicode__(self):
            return "{}".format(self.name)
        __repr__=__str__

    a1 = Person("郝大爺",21,"IT")
    a2= Person("郝叔叔",21,"程序猿")
    a3 = Person("好爸爸",21,"工程師")
    person_list = [a1,a2,a3]
    return render(request,
                  "exp.html",
                  {"lis":lis,"dic":dic,"person_list":person_list,"kong":kong,
                   "filesize":filesize,"a":a,"lis1":lis1,"lis2":lis2,"b":b,"string":string,
                   "long_str":long_str,"data_now":data_now,‘js‘: """<script>
                                                                         for(var i=0;i<5;i++){
                                                                            alert(‘123‘)
                                                                                        }
                                                                    </script>""",
                   ‘a_html‘: ‘<a href="https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#date">點擊</a>‘,
                   "a1":a1}
                  )
技術分享圖片

urls.py

技術分享圖片
from django.conf.urls import url
from django.contrib import admin
from app01 import views

urlpatterns = [
    url(r‘^admin/‘, admin.site.urls),
    url(r‘^exp/‘, views.exp),
]
技術分享圖片

自定義filters:

技術分享圖片

exp.html:

技術分享圖片
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>模板測試</title>
</head>
<body>
{{ lis.0 }}
<hr>
{{ lis.2 }}
<hr>
{{ lis }}
<hr>
{% for num in lis %}
    {{ num }}
{% endfor %}
<hr>
{{ dic.name }}
<hr>
{{ dic.keys }}
{{ dic.values }}
{{ dic.items }}
<hr>
{% for key,value in dic.items %}
    {{ key }}:{{ value }}
{% endfor %}
<hr>
{{ person_list.0.name }}
{{ person_list.1.job }}
{{ person_list.2.name }}
<hr>
{{ person_list.0.dream }}
<hr>
{{ kong|default:"nothing" }}
<hr>
{{ kongkong|default:"nothing" }}
<hr>
{{ filesize|filesizeformat }}
<hr>
{{ a|add:"1" }}
<hr>
{{ lis1|add:lis2 }}
<hr>
{{ b|lower|title }}
<hr>
<p>{{ string|center:"30" }}</p>
<hr>
{{ string|length }}
<hr>
{{ lis|slice:"-1:-3:-1" }}
<hr>
{{ string|first }}
<hr>
{{ lis|join:"_" }}
<hr>
{{ long_str|truncatechars:"9" }}  {#截斷#}
<hr>
{{ data_now|date:"Y-m-d H:i:s" }}   {# 日期格式化 #}
<hr>
{{ js|safe }}
<hr>
{{ a_html|safe }}
<hr>
{{ a1 }}
<hr>
{{ person_list.0 }}
<hr>
{% load my_filters %}
{{ a1.name|my_filters:"好" }}
<hr>
{{ a1.name }}
<hr>
{{ person_list }}    {# 通過列表會調用類中的__repr__方法,還是會顯示對象的地址,並不會顯示對象.name,所以要加上__repr__=__str__ 可另行更改__repr__#}
<hr>
{{ a1 }}
</body>
</html>
技術分享圖片

Django框架簡介及模板Template