4 Template層 -定義模板

1.模板介紹

  • 做爲Web框架,Django提供了模板,能夠很便利的動態生成HTML
  • 模版系統致力於表達外觀,而不是程序邏輯
  • 模板的設計實現了業務邏輯(view)與顯示內容(template)的分離,一個視圖能夠使用任意一個模板,一個模板能夠供多個視圖使用
  • 模板包含
    • HTML的靜態部分
    • 動態插入內容部分
  • Django模板語言,簡寫DTL,定義在django.template包中
  • 由startproject命令生成的settings.py定義關於模板的值:
    • DIRS定義了一個目錄列表,模板引擎按列表順序搜索這些目錄以查找模板源文件
    • APP_DIRS告訴模板引擎是否應該在每一個已安裝的應用中查找模板
  • 經常使用方式:在項目的根目錄下建立templates目錄,設置DIRS值
DIRS=[os.path.join(BASE_DIR,"templates")]

 

 

  (1)模板處理

  • Django處理模板分爲兩個階段
  • Step1 加載:根據給定的標識找到模板而後預處理,一般會將它編譯好放在內存中
loader.get_template(template_name),返回一個Template對象

 

  • Step2 渲染:使用Context數據對模板插值並返回生成的字符串
Template對象的render(RequestContext)方法,使用context渲染模板

 

  • 加載渲染完整代碼:
from django.template import loader, RequestContext from django.http import HttpResponse def index(request): tem = loader.get_template('temtest/index.html') context = RequestContext(request, {}) return HttpResponse(tem.render(context))

 

  (2)快捷函數

  • 爲了減小加載模板、渲染模板的重複代碼,django提供了快捷函數
  • render_to_string("")
  • render(request,'模板',context)
from django.shortcuts import render def index(request): return render(request, 'temtest/index.html')

 

 

 

2.定義模板

  • 模板語言包括
    • 變量
    • 標籤 { % 代碼塊 % }
    • 過濾器
    • 註釋{# 代碼或html #}

3. 變量  {{ variable }}

  • 語法:
{{ variable }}

 

  • 當模版引擎遇到一個變量,將計算這個變量,而後將結果輸出
  • 變量名必須由字母、數字、下劃線(不能如下劃線開頭)和點組成
  • 當模版引擎遇到點("."),會按照下列順序查詢:若是變量不存在, 模版系統將插入'' (空字符串)
字典查詢,例如:foo["bar"] 對象的屬性或方法查詢,例如:foo.bar 數字索引查詢,例如:foo[bar]

 

  • 在模板中調用方法時不能傳遞參數

 

  實例:在模板中調用對象的方法

  • 在models.py中定義類HeroInfo
from django.db import models class HeroInfo(models.Model): ... def showName(self): return self.hname

 

  • 在views.py中傳遞HeroInfo對象
from django.shortcuts import render from models import * def index(request): hero = HeroInfo(hname='abc') context = {'hero': hero} return render(request, 'temtest/detail.html', context)

 

  • 在模板detail.html中調用
{{hero.showName}}

 

 

 

 

 

4.標籤 { % tag % }

  • 語法:{ % tag % }
  • 做用
    • 在輸出中建立文本
    • 控制循環或邏輯
    • 加載外部信息到模板中供之後的變量使用

 

  (1)for標籤

{ %for ... in ...%} 循環邏輯 {{forloop.counter}}表示當前是第幾回循環 { %empty%} 給出的列表爲或列表不存在時,執行此處 { %endfor%}

 

 

 

  (2)if標籤

{ %if ...%} 邏輯1 { %elif ...%} 邏輯2 { %else%} 邏輯3 { %endif%}

 

 

  (3)comment標籤html

{ % comment % } 多行註釋 { % endcomment % }

 

  (4)include:加載模板並以標籤內的參數渲染django

{ %include "foo/bar.html" % }
 
 

  (5)url:反向解析框架

{ % url 'name' p1 p2 %}

 

  

  (6)csrf_token:這個標籤用於跨站請求僞造保護函數

{ % csrf_token %}

 

  • 布爾標籤:and、or,and比or的優先級高
  • block、extends:詳見「模板繼承」
  • autoescape:詳見「HTML轉義」

 

5.過濾器

  • 語法:{ { 變量|過濾器 }},例如{ { name|lower }},表示將變量name的值變爲小寫輸出
  • 使用管道符號 (|)來應用過濾器
  • 經過使用過濾器來改變變量的計算結果
  • 能夠在if標籤中使用過濾器結合運算符
if list1|length > 1

 

  • 過濾器可以被「串聯」,構成過濾器鏈
name|lower|upper

 

  • 過濾器能夠傳遞參數,參數使用引號包起來
list|join:", "

 

  • default:若是一個變量沒有被提供,或者值爲false或空,則使用默認值,不然使用變量的值
value|default:"什麼也沒有"

 

  • date:根據給定格式對一個date變量格式化
value|date:'Y-m-d'

 

  • escape:詳見「HTML轉義」
  • 點擊查看詳細的過濾器

6.註釋

  • 單行註釋
{#...#}

 

  • 註釋能夠包含任何模版代碼,有效的或者無效的均可以
{# { % if foo % }bar{ % else % } #}

 

  • 使用comment標籤註釋模版中的多行內容
{ % comment % } 多行註釋 { % endcomment % }
相關文章
相關標籤/搜索