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