聲明:部分信息來源這篇博客https://www.cnblogs.com/maple-shaw/articles/9333821.html
創(chuàng)新互聯(lián)主營濱湖網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,App定制開發(fā),濱湖h5微信小程序搭建,濱湖網(wǎng)站營銷推廣歡迎濱湖等地區(qū)企業(yè)咨詢
Django框架的設(shè)計(jì)模式借鑒了MVC框架的思想,也是分成三部分,來降低各個(gè)部分之間的耦合性。
Django框架的不同之處在于它拆分的三部分為:Model(模型)、Template(模板)和View(視圖),也就是MTV框架。
Model(模型):負(fù)責(zé)業(yè)務(wù)對(duì)象與數(shù)據(jù)庫的對(duì)象(ORM)
Template(模版):負(fù)責(zé)如何把頁面展示給用戶
View(視圖):負(fù)責(zé)業(yè)務(wù)邏輯,并在適當(dāng)?shù)臅r(shí)候調(diào)用Model和Template
此外,Django還有一個(gè)urls分發(fā)器,它的作用是將一個(gè)個(gè)URL的頁面請(qǐng)求分發(fā)給不同的view處理,view再調(diào)用相應(yīng)的Model和Template
Django框架圖示
只有兩種特殊符號(hào)
{{變量}}
{% 邏輯 %}如for循環(huán)等
注意:當(dāng)模板系統(tǒng)遇到一個(gè)(.)時(shí),會(huì)按照如下的順序去查詢:
https://docs.djangoproject.com/en/1.11/ref/templates/language/#filters django官方文檔
https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#ref-templates-builtins-filters django過濾器官方文檔1
用來修改變量在html的顯示結(jié)果
語法
語法: {{ 變量(或者字符串等等)|方法名:參數(shù) }}#:前后不可以有空格
default默認(rèn)值過濾器
{{ 變量|default:"nothing"}}#如果value值沒傳的話就顯示設(shè)置的默認(rèn)值nothing
注:在setting.py中TEMPLATES的OPTIONS可以增加一個(gè)選項(xiàng):string_if_invalid:'找不到',可以替代default的的作用。
filesizeformat文件尺寸過濾器
{{ 變量|filesizeformat }}#將值格式化為一個(gè) “人類可讀的” 文件尺寸 (例如 '13 KB', '4.1 MB', '102 bytes', 等等),最大支持單位pB
add
{{ 變量|add:"2" }}#給變量加參數(shù),相當(dāng)于py中的加號(hào),可以數(shù)字運(yùn)算,字符串拼接,列表拼接
lower
{{ 變量|lower }}#小寫
upper
{{ 變量|upper}}#大寫
title
{{ 變量|title }}#標(biāo)題
ljust
{{ 變量|ljust:"10" }}#左對(duì)齊
rjust
{{ 變量|rjust:"10" }}#右對(duì)齊
center
{{ 變量|center:"15" }}#居中
length
{{ 變量|length }}#變量長(zhǎng)度
slice
{{變量|slice:"2:-1"}}#切片
first
{{ 變量|first }}#取第一個(gè)元素
last
{{ 變量|last }}#取最后一個(gè)元素
join
{{ 變量|join:" // " }}#使用字符串拼接列表。同python的str.join(list)。
truncatechars
{{ 變量|truncatechars:9}}#如果字符串字符多于指定的字符數(shù)量,那么會(huì)被截?cái)?。截?cái)嗟淖址畬⒁钥煞g的省略號(hào)序列(“...”)結(jié)尾。
date
{{ 變量|date:"Y-m-d H:i:s"}}#日期格式化
safe
假如value = "點(diǎn)我"
{{ 變量|safe}}#Django的模板為了安全會(huì)對(duì)HTML標(biāo)簽和JS等語法標(biāo)簽進(jìn)行自動(dòng)轉(zhuǎn)義,safe能取消django的轉(zhuǎn)義
{% widthratio 100; 1 100%}#先除后乘,需要三個(gè)參數(shù)
在app下創(chuàng)建一個(gè)名為templatetags的python包;
在python中創(chuàng)建py文件,文件名自定義(my_tags.py);
在my_tags.py文件中配置
from django import template#導(dǎo)入模塊
register = template.Library() #標(biāo)準(zhǔn)語句都不能改
#寫函數(shù)裝飾器
@register.filter
def add_xx(value, arg): # 最多有兩個(gè)
return '{}-{}'.format(value, arg)#返回兩個(gè)值的拼接
#在html使用方式
{% load my_tags %}#引用模塊
{{ 'alex'|add_xx:'dsb' }}#通過函數(shù)名使用
@register.filter(name = xxx)#可以直接通過name等于的xxx取引用
def add_xx(value, arg): # 最多有兩個(gè)
return '{}-{}'.format(value, arg)#返回兩個(gè)值的拼接
#在html使用方式
{% load my_tags %}#引用模塊
{{'alex'|xxx:'dsb'}}#通過賦值的name引用
自定義過濾器只是帶有一個(gè)或兩個(gè)參數(shù)的Python函數(shù):
for語法
{% for user in user_list %}
- {{ user.name }}
{% endfor %}
Variable | Description |
---|---|
forloop.counter |
當(dāng)前循環(huán)的索引值(從1開始) |
forloop.counter0 |
當(dāng)前循環(huán)的索引值(從0開始) |
forloop.revcounter |
當(dāng)前循環(huán)的倒序索引值(到1結(jié)束) |
forloop.revcounter0 |
當(dāng)前循環(huán)的倒序索引值(到0結(jié)束) |
forloop.first |
當(dāng)前循環(huán)是不是第一次循環(huán)(布爾值) |
forloop.last |
當(dāng)前循環(huán)是不是最后一次循環(huán)(布爾值) |
forloop.parentloop |
本層循環(huán)的外層循環(huán) |
for... empty
{% for book in all_books %}
.....
{% empty %}
沒有相關(guān)的數(shù)據(jù)
{% endfor %}
dango的if語句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判斷。
django的if與python的區(qū)別
python 10>5>1 --> 10>5 and 5>1 true
django 10>5>1 --> 10>5 --> true --> 1>1 false
模板的if&elif&else實(shí)例
{% if user_list %}
用戶人數(shù):{{ user_list|length }}
{% elif black_list %}
黑名單數(shù):{{ black_list|length }}
{% else %}
沒有用戶
{% endif %}
with定義一個(gè)中間變量,在django模板中有些值,需要多次使用,我們就可以通過with定義變量,方便使用
{% with total=business.employees.count %}
{#將business.employees.count值定義為total可以在語句內(nèi)使用#}
{{ total }} employee{{ total|pluralize }}
{% endwith %}
{#結(jié)束with語句#}
csrf_token標(biāo)簽用于跨站請(qǐng)求偽造保護(hù)。(django的保護(hù)機(jī)制為了防止post請(qǐng)求是從其他端發(fā)送來的,需要一個(gè)認(rèn)證,直接發(fā)送,會(huì)報(bào)403錯(cuò)誤,加入這個(gè)標(biāo)簽代表加入了認(rèn)證方法,就能夠在django中發(fā)送post請(qǐng)求了)
在頁面的form表單里面寫上{% csrf_token %}
{# 注釋內(nèi)容 #}
{#注釋內(nèi)容#}單行注釋,多行就是多敲幾遍
注意事項(xiàng):
Django的模板語言不支持連續(xù)判斷,即不支持以下寫法:
{% if 10 > 5 > 1 %}
...
{% endif %}
{{ data.items }}
注意:我們通常會(huì)在母板中定義頁面專用的CSS塊和JS塊,方便子頁面替換。
子頁面繼承母版,方便使用母版的樣式
{% extends '母板.html' %}
{#輸入這個(gè)語句就可以繼承母版.html的樣式 #}
{#通過在母板中使用{% block xxx %}來定義"塊"。
在子頁面中通過定義母板中的block名來對(duì)應(yīng)替換母板中相應(yīng)的內(nèi)容。如果不在定義的塊中則不會(huì)出現(xiàn)效果#}
注意在母版中需要定義一個(gè)塊,子網(wǎng)頁的中數(shù)據(jù)寫一個(gè)塊,名稱要與母版的塊名相同才能替換
{#實(shí)例,下面就是我們?cè)诶^承母版的子頁面,定義的塊中,輸入幾條語句#}
{% block page-main %}
世情薄
人情惡
雨送黃昏花易落
{% endblock %}
組件與母版類似,不同的是,母版比較大,不經(jīng)常變動(dòng),而在網(wǎng)頁中我們有些是需要靈活變動(dòng)的,這時(shí)候我們就需要組件來幫忙了,組件本質(zhì)也是繼承一個(gè)文件,不同的是組件是較少代碼的繼承
繼承組件語法
{% include '組件.html' %}
在我們一般時(shí)候中,需要對(duì)靜態(tài)文件設(shè)置一個(gè)別名,才可以使用靜態(tài)文件中的文件等,可如果出現(xiàn),別名被改動(dòng),我們就需要去html中一個(gè)個(gè)修改文件導(dǎo)入的名稱,這樣不夠,于是django替我們想到了這個(gè)情況,我們可以通過下面幾種模板標(biāo)簽方式,避免這種問題
方式一
{% load static %}
{#導(dǎo)入static方法#}
{#{% static "images/hi.jpg" %}中的static代表著我們的靜態(tài)文件別名,可以隨著我們的修改動(dòng)態(tài)的變化#}
方式二
{#使用get_static_prefix#}
{% load static %}
{#get_static_prefix代表當(dāng)前的靜態(tài)文件別名,與路徑拼接即可,不過不如方式一方便,不經(jīng)常使用#}
和自定義filter類似,只不過能夠接收更靈活的參數(shù)。
實(shí)例
定義注冊(cè)simple tag
@register.simple_tag(name="plus")
def plus(a, b, c):
return "{} + {} + {}".format(a, b, c)#將傳進(jìn)來的參數(shù)進(jìn)行拼接返回
在模板中使用
{% load app01_demo %}
{% plus "1" "2" "abc" %}
在網(wǎng)頁中我們模板有些樣式是需要跟著服務(wù)端的數(shù)據(jù),靈活變動(dòng)的,這時(shí)我們就需要通過服務(wù)端動(dòng)態(tài)的給模板返回html代碼,這種方式就是inclusion_tag
動(dòng)態(tài)返回分頁數(shù)實(shí)例:
{% load my_tags %}
{% page 2 %}
{#使用inclusion_tag#}
@register.inclusion_tag('page.html')#返回值返回的頁面
def page(num):
return {'num': range(1, num + 1)}#返回的數(shù)據(jù)
好了,django模板的東西就說到這了,其他沒有說到或遺漏的的,博客內(nèi)有django的官網(wǎng),大家可以去官網(wǎng)具體了解學(xué)習(xí)