轉自:https://www.cnblogs.com/zzy-9318/p/8672945.htmlcss
1、經常使用語法html
只須要記兩種特殊符號:django
{{ }}和 {% %}bootstrap
變量相關的用{{}},邏輯相關的用{%%}。安全
首先把views裏代碼貼出了,以後就是在HTML中各類模板語言替換了 本質都是字符串的替換app
def template(request): s='你好' l=['aa','bb','cc'] ss='簌簌衣襟落棗花,村南村北響繅車,牛衣古柳賣黃瓜。酒困路長唯欲睡,日高人渴漫思茶,敲門試問野人家。' dic={'name':'二哥','age':18,} class Template(object): def __init__(self,name,age): self.name=name self.age=age p1=Template('zzy',18) p2=Template('zxc',28) list_dic = [p1,p1] file_size=12345 import datetime date=datetime.datetime.now() return render(request,'template.html',{'template':p1, 's':s, 'l':l, 'dic':dic, 'ss':ss, 'list_dic':list_dic, 'file_size':file_size, 'date':datetime.datetime.now()})
2、變量ide
{{ 變量名 }}函數
點(.)在模板語言中有特殊的含義,用來獲取對象的相應屬性值。post
下面舉例更清晰ui
{#單獨字符串#} {{ s }}
{#類的對象。經過 點屬性 能夠獲取屬性值#} {{ template.name }}
{#字典類型的 直接取key對應的value#} {{ dic.name }} </p> {#列表取值#} <div> {% for i in l %} {{ i.0 }}:{{ i.1 }} 輸出:a:a b:b c:c {% endfor %} </div>
總結模板支持的寫法
{# 取l中的第一個參數 #} {{ l.0 }} {# 取字典中key的值 #} {{ d.name }} {# 取對象的name屬性 #} {{ person_list.0.name }} {# .操做只能調用不帶參數的方法 #} {{ person_list.0.dream }}
3、內置Filters
先看例子
{#大段文字截取,剩餘的文字用省略號#} {{ss|truncatechars:30}} 輸出:簌簌衣襟落棗花,村南村北響繅車,牛衣古柳賣黃瓜。酒困路... {#列表中是字典取值#} <div>{{ list_dic.1.name }}:{{ list_dic.1.age }}</div> 輸出:zzy:18 {#計算文件大小#} {{ file_size|filesizeformat }} {#時間對象#} <div> {{ date|date:"Y:m:d H:i:s" }}</div> 輸出:2018:03:29 21:29:54 {#切片示例#} <div>{{ ss|slice:'2:8' }}</div> 輸出:衣襟落棗花, {#求列表的長度#} <div> {{ l|length }} </div>
總結知識點
default
{{ value:default: "nothing"}}
length
{{ value|length }}
'|'左右沒有空格沒有空格沒有空格
返回value的長度,如 value=['a', 'b', 'c', 'd']的話,就顯示4.
filesizeformat
{{ value|filesizeformat }}
將值格式化爲一個 「人類可讀的」 文件尺寸 (例如 '13 KB'
, '4.1 MB'
, '102 bytes'
, 等等)。例如:
slice 切片
{{value|slice:"2:-1"}}
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}}
truncatechars
若是字符串字符多於指定的字符數量,那麼會被截斷。截斷的字符串將以可翻譯的省略號序列(「...」)結尾。 參數:截斷的字符數
{{ value|truncatechars:9}}
with定義一箇中間變量,若是以爲本身的變量名太長,能夠用with賦一個別名
{% with obj=list_dic.1.name %} {% for i in obj %} {% endfor%} {% endwith %}
csrf_token
在你的form表單中寫入csrf_token,這個標籤用於跨站請求僞造保護
4、自定義filter
自定義filter代碼文件擺放位置:
app01/ __init__.py models.py templatetags/ # 在app01下面新建一個package __init__.py app01_filters.py # 建一個存放自定義filter的文件 views.py
編寫自定義filter
在filter的文件寫你的代碼
舉例:實如今頁面中輸入三個數自動輸出他們的和
編寫自定義filter
from django import template register = template.Library() @register.filter(name="cut") def cut(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|cut:"0" }} {{ d.name|addSB }}
for循環
<ul> {% for user in user_list %} <li>{{ user.name }}</li> {% endfor %} </ul>
for ... empty 若是替換內容爲空就顯示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判斷。
母板
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="x-ua-compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Title</title> {% block page-css %} {% endblock %} </head> <body> <h1>這是母板的標題</h1> {% block page-main %} {% endblock %} <h1>母板底部內容</h1> {% block page-js %} {% endblock %} </body> </html>
咱們一般會在母板中定義頁面專用的CSS塊和JS塊,方便子頁面替換。
{% block page_css %} {% endblock %} {% block page_js %} {% endblock %}
繼承母板
在子頁面中在頁面最上方使用下面的語法來繼承母板。
{% extends 'layouts.html' %}
塊(block)
經過在母板中使用{% block xxx %}
來定義"塊"。
在子頁面中經過定義母板中的block名來對應替換母板中相應的內容。
{% block page-main %} <p>世情薄</p> <p>人情惡</p> <p>雨送黃昏花易落</p> {% endblock %}
組件
能夠將經常使用的頁面內容如導航條,頁尾信息等組件保存在單獨的文件中,而後在須要使用的地方按以下語法導入便可。
{% include 'navbar.html' %}
靜態文件相關
{# 動態獲取static路徑,當你setting裏面的STATIC_URL = '/static/'修改了名字,也不用擔憂#} {# <link rel="stylesheet" href="/static/bootstrap/css/bootstrap.min.css">#} {# 先導入static 會自動去#} {% load static %} <link rel="stylesheet" href={% static "bootstrap/css/bootstrap.min.css" %} >
某個文件多處被用到能夠存爲一個變量
{% load static %} {% static "images/hi.jpg" as myphoto %} <img src="{{ myphoto }}"></img>
5、自定義simpletag
和自定義filter相似,只不過接收更靈活的參數。
定義註冊simple tag
1:首先在app中寫一個求和的函數,而且作一些處理
# 導入模板方法 from django import template register=template.Library() # 註冊這個filter方法 @register.simple_tag(name='add_sum') def add_sum(a,b,c): return a+b+c
2.在你要做用的HTML頁面中寫執行代碼
{#2:寫好函數後導入函數py文件#} {#2:注意寫法,用一個花括號,同時傳入的參數不加逗號#} <div> {% load add_sum %} {% add_sum 1 2 3%} </div>
inclusion_tag
多用於返回html代碼片斷 須要三個文件 第一個寫自定義的filter ;第二個是寫執行filter的,在做用的html頁面內寫 ;第三個filter代碼要替換的字符串
templatetags/add_sum.py
from django import template register = template.Library() # 當咱們調用func方法,就會返回inclusion_2.html裏面的內容 @register.inclusion_tag('inclusion_2.html') def func(num): num=1 if num<1 else int(num) #三元運算 data=['第{}項'.format(i) for i in range(1,num+1)] #[第1項,第2項....] return {'data':data} #模板語言:返回數據給inclusion_2.html中,實現字符串的替換
templates/snippets/inclusion_2.html
<ul> {% for choice in data %} <li>{{ choice }}</li> {% endfor %} </ul>
templates/index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="x-ua-compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>inclusion_tag test</title> </head> <body> #導入寫自定義filter方法的文件 {% load add_sum %} #調用方法中func函數,傳進一個參數 {% func 10 %} </body> </html>