==【具體示例參照博文最後的綜合示例】==html
模版組成前端
HTML + 邏輯控制代碼(如:python、PHP等)
邏輯控制代碼組成python
{{變量名稱}}
建立模版shell
Template("內容")
模版變量django
{'name':'text'}
Django環境後端
python manange.py shell
template模版 和 context上下文對象瀏覽器
>>>from django.template import Context,Template >>>t = Template("Hello,{{ name }}") >>>c = Context({'name':'Django'}) >>>t.render(c) 'Hello,Django'
句點符是一種 Django 深度查找變量比較快捷的一種方式,可用於字符串、字典、列表、類等多種類型的使用安全
{{變量|filter:函數}}
函數 | 釋義 |
---|---|
add | 給變量添加相應的值 |
addslashes | 給變量中的引號加轉義符 |
capfirst | 首字母大寫 |
cut | 從字符串中移除指定字符 |
date | 格式化日期字符串 |
default | 若是值是False,替換成設置的值,不然爲原值 |
default_if_none | 若是值是None,替換成設置的值,不然爲原值 |
建立自定義函數條件架構
- 在app中建立templatetags模塊[必須使用此名稱]
- 建立任意.py文件
須要固定格式app
from django import template from django.utils.safestring import mark_safe register = template.Library() #register對象名稱是固定的,不可改變 #自定義過濾器【傳參只能傳一個】 @register.filter def 自定義函數(參數): 代碼塊 return 返回值 #自定義標籤【不能用在控制語句】 @register.simple_tag def 自定義函數(參數): 代碼塊 return 返回值
自定義過濾器使用
{{函數|自定義標籤名}}
自定義標籤使用
{% simple_tag_multi 值1 值2 %}
語法
{%if 條件%} 代碼塊 {%elif%} 代碼塊 {%else%} 代碼塊 {%endif%}
語法
{% for %} 代碼塊 {% endfor %}
特殊變量 | 釋義 |
---|---|
{{forloop.counter1}} | 循環計數,後跟數字爲計數起始值 |
{{forloop.revcounter}} | 反向循環 |
{{forloop.revcounter2}} | 反向循環計數,後跟數字爲計數起始值 |
{{forloop.first}} | 返回布爾值,第一次循環時值爲True,其它循環爲Flase |
{{forloop.last}} | 返回布爾值,最後一次循環時值爲True,其它循環爲Flase |
- Django視圖中間件的一種安全機制
- 開啓方式: setting --- MIDDLEWARE 的參數中【默認開啓】
- 若是開啓而且 模版中無 csrf_token 設置則返回403
setting開啓設置,關閉註釋便可,默認開啓狀態
'django.middleware.csrf.CsrfViewMiddleware',
模版設置
{% csrf_token %}
範圍僅限於 with 和 endwith 之間
用法
{% with 新變量名=原變量名%} 新變量名代碼塊 {% endwith %}
範圍僅限於 verbatim 和 endverbatim 之間
{% verbatim %} 代碼塊,所有以字符串形式出現 {% endverbatim %}
詳見下文綜合示例
架構
Mydjango APP migrations templates backup.html index.html test.html templatetags MyTag.py admin.py apps.py models.py views.py Mydjango settings urls.py wsgi.py
urls.py
from django.contrib import admin from django.urls import path,re_path from APP import views urlpatterns = [ path('admin/', admin.site.urls), re_path('^$',views.Test), path('backup',views.Back), ]
settings.py 改動
INSTALLED_APPS 中添加你創建的應用'APP',以,號結尾
TEMPLATES配置: 'DIRS': [os.path.join(BASE_DIR, 'APP/templates')],
views.py
# -*- coding:utf8 -*- from django.shortcuts import render import datetime class C_test(): def __init__(self,name): self.name=name def Test(request): A = "<a href="">click</a>" S = "hello,'Django'" T = datetime.datetime.now() M = '' N = None L = ["一","二","三"] D = {"name":"小明","age":20} C = C_test("小紅") return render(request,"index.html",locals()) def Back(request): return render(request,"backup.html")
index.html
<style> *{color:green;} </style> {% block Alter%} <!--定義模版開始,模版名稱爲 Alter--> <body> <div>---------------------------------- 句點符 ---------------------------------------- </div> <div>{{ L }}</div> <!-- 取整個列表--> <div>{{ L.0 }}</div> <!--取列表中第一位--> <div>{{ D }}</div> <!--取整個字典--> <div>{{ D.name }}</div> <!--取字典指定鍵的值--> <div>{{ C }}</div> <!--類的實例對象--> <div>{{ C.name }}</div> <!--類對象中的變量--> <div>---------------------------------- 過濾器 ---------------------------------------- </div> <div>{{ D.age|add:2 }}</div> <!--取字典指定鍵的值,並增長值--> <div>{{ S|addslashes }}</div> <!--引號加轉義符--> <div>{{ S|capfirst }}</div> <!--首字符變大寫--> <div>{{ S|cut:'hello' }}</div> <!--移除指定字符--> <div>{{ T}}</div> <!--未通過處理日期--> <div>{{ T|date }}</div> <!--通過處理的日期--> <div>{{ M|default:"空值" }}</div> <!--空值處理--> <div>{{ N|default_if_none:"none值" }}</div> <!--None 值處理--> <div>---------------------------------- 篩選器 ---------------------------------------- </div> <div>{{ S|first }}</div> <!--字符串第一位--> <div>{{ S|last }}</div> <!--字符串最後一個位--> <div>{{ S|length }}</div> <!--字符串長度--> <div>{{ S|slice:":3" }}</div> <!--字符串前幾位--> <div>{{ S|slice:":-5" }}</div> <!--字符串後幾位去掉--> <div>---------------------------------- 特殊符 ---------------------------------------- </div> <div>{{ S|filesizeformat }}</div> <!--變量值大小--> <div>{{ A|safe }}</div> <!--瀏覽器後端傳輸前端未渲染的內容渲染處理--> <div>{{ S|urlencode }}</div> <!--編碼轉換--> <div>---------------------------------- 條件判斷 ---------------------------------------- </div> {% if D.age > 20 %} <div>{{D.name}}的年齡大於20</div> {% elif D.age is 20 %} <div>{{D.name}}的年齡等於20</div> {% else %} <div>{{D.name}}的年齡小於20</div> {%endif%} <div>---------------------------------- for循環語句 ---------------------------------------- </div> {% for i in L %} <div>第{{forloop.counter}}次循環,循環內容{{i}}</div> {% endfor %} <div>---------------------------------- 模版繼承 ---------------------------------------- </div> <ul> <li>【模版範圍是模版代碼開始和結束之間的內容】</li> <li>【模版內容包含的變量代碼不能繼承,只能繼承靜態代碼】</li> </ul> </body> {% endblock%} <!--定義模版結束-->
test.html
<div>用於引用測試的HTML文件</div>
backup.html
{% extends "index.html" %} <!--模版繼承--> {% load staticfiles %} <!--用於引用其餘靜態文件--> {% block Alter%} <!-- 引用模版 Alter 開始--> <style> *{background: yellow;} /*新增樣式示例*/ </style> {{ block.super}} <!-- 獲取父類內容--> {% include "test.html"%} <!--引入的 HTML 測試靜態文件--> {% endblock%} <!-- 引用模版 Alter 結束-->
訪問 http://127.0.0.1:8000 效果展現測試
---------------------------------- 句點符 ---------------------------------------- ['一', '二', '三'] 一 {'name': '小明', 'age': 20} 小明 <APP.views.C_test object at 0x000001927B2C1D30> 小紅 ---------------------------------- 過濾器 ---------------------------------------- 22 hello,\'Django\' Hello,'Django' ,'Django' Aug. 29, 2018, 5:10 p.m. Aug. 29, 2018 空值 none值 ---------------------------------- 篩選器 ---------------------------------------- h ' 14 hel hello,'Dj ---------------------------------- 特殊符 ---------------------------------------- 0 bytes click hello%2C%27Django%27 ---------------------------------- 條件判斷 ---------------------------------------- 小明的年齡等於20 ---------------------------------- for循環語句 ---------------------------------------- 第1次循環,循環內容一 第2次循環,循環內容二 第3次循環,循環內容三 ---------------------------------- 模版繼承 ---------------------------------------- 【模版範圍是模版代碼開始和結束之間的內容】 【模版內容包含的變量代碼不能繼承,只能繼承靜態代碼】
訪問 http://127.0.0.1:8000/backup 模版繼承和改動測試
---------------------------------- 句點符 ---------------------------------------- ---------------------------------- 過濾器 ---------------------------------------- 空值 ---------------------------------- 篩選器 ---------------------------------------- 0 ---------------------------------- 特殊符 ---------------------------------------- 0 bytes ---------------------------------- 條件判斷 ---------------------------------------- 的年齡小於20 ---------------------------------- for循環語句 ---------------------------------------- ---------------------------------- 模版繼承 ---------------------------------------- 【模版範圍是模版代碼開始和結束之間的內容】 【模版內容包含的變量代碼不能繼承,只能繼承靜態代碼】