【轉】Django 模板語法
轉自:https://www.cnblogs.com/love9527/p/9077863.html
Django 模板語法
一、模板
只要是在html裏面有模板語法就不是html文件了,這樣的文件就叫做模板。
二、模板語法
模板語法變量:{{ }}
在Django模板中遍歷復雜數據結構的關鍵是句點字符 .(其實就是點號)
views.py
from django.shortcuts import render
def index(request):
name = "Hello world!"
number = 101
lst = [1, 2, 3, 4, 5]
dic = {"name": "eric", "job": "teacher"}
class People:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return self.name + str(self.age)
def dream(self):
return "你有夢想嗎?"
# 實例化
person_jack = People("jack", 10)
person_pony = People("pony", 36)
person_cent = People("cent", 55)
person_list = [person_jack, person_pony, person_cent]
return render(request, "index.html",
{
"name": name,
"num": number,
"lst": lst,
"dic": dic, # 鍵對應的是模板裏的名字,值對應的是上面定義的值
"person_jack": person_jack,
"person_pony": person_pony,
"person_list": person_list
}
)
templates/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Django 模板</title>
</head>
<body>
<h3>變量{{ variable }}:深度查詢</h3>
<h5>{{ name }}</h5>
<p>{{ num }}</p>
<p>{{ lst }}</p>
<p>{{ dic }}</p>
<p>{{ lst.0 }}</p>
<p>{{ lst.4 }}</p>
<p>{{ dic.name }}</p>
<p>{{ dic.job}}</p>
<p>{{ person_jack.name }}</p>
<p>{{ person_jack.age }}</p>
<p>{{ person_list.2.name }}</p>
</body>
</html>
運行輸出結果如下圖所示:
註意:在使用templates時,需要在django項目的settings配置文件中對templates的路徑做如下配:
TEMPLATES = [
{
‘BACKEND‘: ‘django.template.backends.django.DjangoTemplates‘,
# os.path.join(BASE_DIR, "templates"),啟用django模板;
# 如果沒有這句會出現"django.template.exceptions.TemplateDoesNotExist: index.html"錯誤
‘DIRS‘: [os.path.join(BASE_DIR, "templates")],
‘APP_DIRS‘: True,
‘OPTIONS‘: {
‘context_processors‘: [
‘django.template.context_processors.debug‘,
‘django.template.context_processors.request‘,
‘django.contrib.auth.context_processors.auth‘,
‘django.contrib.messages.context_processors.messages‘,
],
},
},
]
其中,局點符也可以用來引用對象的方法(無參數方法)
<h4>字典:{{ dic.name.upper }}</h4>
模板語法標簽:{% tag %}
標簽語法是:{% tag %},它比變量更加復雜:一些在輸出中創建文本,一些通過循環或者邏輯來控制流程,一些加載其後的變量將使用道德額外信息到模板中。一些標簽需要開始和結束標簽(例如:{% tag %}... 標簽內容...{% endtag %})。
1.for標簽(循環序號可以通過{{ forloop }}顯示)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Django 模板</title>
</head>
<body>
<h3>循環取值</h3><hr>
{% for item in person_list %}
<p>{{ item.name }}, {{ item.age }}</p>
{% endfor %}
<h3>循環取值:倒序</h3>
{% for item in person_list reversed %}
{# 序號從1開始 #}
<p>{{ forloop.counter }}---------->{{ item.name }}, {{ item.age }}</p>
{# 序號從0開始 #}
<p>{{ forloop.counter0 }}---------->{{ item.name }}, {{ item.age }}</p>
{# 序號倒序 #}
<p>{{ forloop.revcounter }}---------->{{ item.name }}, {{ item.age }}</p>
{% endfor %}
<h3>循環取值:字典</h3>
{% for key, value in dic.items %}
<p>{{ key }}, {{ value }}</p>
{% endfor %}
</body>
</html>
運行結果如下圖所示:
2.for ... empty:for標簽帶有一個可選的{% empty %}從句,以便再給出的組是空的或者沒有被找到時,可以有所操作
{% for person in person_list %}
<p>{{ person.name }}</p>
{% empty %}
<p>sorry,no this person</p>
{% endfor %}
3.if標簽:{% if %}會對一個變量求值,如果它的值是"True"(存在、不為空且不是boolean類型的false值),對應的內容塊被執行
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Django 模板</title>
</head>
<body>
{% if num > 200 %}
<p>大於</p>
{% elif num == 200 %}
<p>等於</p>
{% else %}
<p>小於</p>
{% endif %}
</body>
</html>
4.with:使用一個簡單的名字還出一個復雜的變量,當我們需要一個"昂貴的"方法(比如:訪問數據庫)很多次的時候是非常有用的
{% with total=business.emlpoyees.count %}
{{ total }} empolyee {{ total | pluralize }}
% endwith %}
<p>{{ person_list.2.name }}</p>
{% with name=person_list.2.name %}
<p>{{ name }}</p>
{% endwith %}
5.csrf_token:跨站點請求偽造保護
提交數據的時候會做安全機制,當用戶點擊提交的時候會出現一個forbidden錯誤,就是用settings配置裏面的csrf做的安全機制,如果我們不需要使用,可以將其註釋。或者在form表單下面添加{% csrf_token %}來解決該問題(這才是真正的解決辦法,註釋不是解決辦法)。
<h3>scrf_token</h3>
<form action="/tag/" method="post">
{% csrf_token %}
<p><input type="text" name="haiyan"></p>
<input type="submit">
</form>
模板語法過濾器:{{ obj|filter__name:param }},過濾器使用管道字符
1.default:{{ variable| default: "nothing"}},如果變量是false或者為空,使用默認值。否則,使用變量的值
<p>default過濾器:{{ li|default:"如果顯示為空,設置解釋性的內容。" }}</p>
2.length:返回值的長度,它對字符串和列表都起作用
{{ value | length }} # 如果value是["a", "b", "c", "d"],那麽輸出是4
3.filesizeformat:將值格式化為"人類可讀"的文件尺寸(例如:13KB,4.1M,102bytes等等)
{{ value | filesizeformat }} # 如果value是123456789,輸出將會是117.7MB
4.date:格式化日期時間格式
{{ value | date:"Y-m-d" }} # 如果value=datetime.datetime.now(),返回時間的年-月-日格式
5.slice:切片
{{ value | slice:"2:-1" }} # 如果value="hello world",返回‘llo worl‘
6.truncatechars:截斷
如果字符串字符多於指定的字符數量,那麽會被截斷。截斷的字符串將以可翻譯的省略號序列(...)結尾,參數:要截斷的字符數。
<p>截斷字符: {{ content | truncatechars:20 }}</p>
<p>截斷單詞: {{ content | truncatewords:4 }}</p>
如果content是"i am is jack, where are you come from?"
輸出結果:截斷字符: i am is jack, whe...;截斷單詞i am is jack, where...
7.safe
django的模板中會對HTML標簽和JS語法標簽進行自動轉義,這樣是為了安全。但是有的時候我們不想這些HTML元素被轉義,比如我們做一個內容管理系統,後臺添加的文章是經過修飾的,這些修飾可能是通過類似於FCKeditor編輯加註了HTML修飾符的文本,如果自動轉義的話顯示的就是保護HTML標簽的源文件。為了在django中關閉HTML自動轉義有兩種方式,如果是一個單獨的變量我們可以通過過濾器"|safe"的方式告訴django這段代碼是安全的不必轉義,如下:
value="<a href="">點擊</a>""
{{ value | safe }}
<p>{{ label }}</p> # 為了安全,系統會把標簽變成字符串
<p>{{ label | safe }}</p> # 加上safe,確定數據時安全的才能被當成是標簽
這裏簡單介紹常用的幾個模板過濾器,更多內容請參考
三、自定義標簽和過濾器
- 1.在app目錄中創建templatetags包(包名只能是templatetags);
- 2.在項目settings.py中把templatetags目錄作為app註冊;
INSTALLED_APPS = [
‘django.contrib.admin‘,
‘django.contrib.auth‘,
‘django.contrib.contenttypes‘,
‘django.contrib.sessions‘,
‘django.contrib.messages‘,
‘django.contrib.staticfiles‘,
‘polls.apps.PollsConfig‘,
‘polls.templatetags‘ # 作為app註冊
]
- 3.在customtags.py文件中添加自定義的標簽和過濾器
from django import template
register = template.Library() # register的名字是固定的,不可改變
@register.filter(name="cut") # 過濾器在模板中使用時的name
def custom_cut(value, arg): # 將傳遞過來的參數arg替換為"#"
return value.repalce(arg, "#")
@register.tag(name="current_time")
def current_time(parse, token): # parse解析器對象,token被解析的對象,包含標簽的名字和格式化的格式
try:
tag_name, format_string = token.split_contents()
except:
raise template.TemplateSyntaxError("syntax")
return CurrentNode(format_string[1:-1]) # 傳入模板中的節點類
import datetime
class CurrentNode(template.Node):
def __init__(self, cus_format):
self.format_string = str(cus_format)
def render(self, context):
now = datetime.datetime.now()
return now.strftime(self.format_string)
- 4.編輯視圖函數,把value傳遞給模板文件:
def index(request):
return render(request, "one.html", {"value": "hello world!"})
- 5.在模板文件中使用的時候需要先導入customtags.py文件:
{% load customtags %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>自定義標簽和過濾器</title>
</head>
<body>
{{ value|cut:"!" }}<br>
{% current_time "%Y-%m-%d %H:%M:%S" %}
</body>
</html>
註意:在模板中不要隨意添加空格,尤其是變量和標簽
運行結果為
【轉】Django 模板語法