django學習筆記-模板層

模板層

將Python嵌入到HTML中。

模板簡介

將HTML硬解碼到視圖並非那麼完美緣由以下:css

  • 對頁面設計時也須要對python代碼進行相應的修改,模板能夠不就行python代碼修改的狀況下變動設計。
  • 編寫python和HTML設計是兩項不一樣的工做,應該明確分工。
  • 兩項同時進行效率最高。

模板:HTML代碼+模板語法html

def current_time(req):
    # ================================原始的視圖函數
    # import datetime
    # now=datetime.datetime.now()
    # html="<html><body>如今時刻:<h1>%s.</h1></body></html>" %now
    # return HttpResponse(html)
    
    #另外一種寫法(推薦)
    import datetime
    now=datetime.datetime.now()
    return render(req, 'current_datetime.html', {'current_date':str(now)[:19]})

模板語法的重點:python

變量:{{ 變量名 }}
    1.深度查詢用句點符
    2.過濾器
標籤:{%  %}

2、模板語言的註釋

{# this won't be rendered #}  單行註釋

註釋多行使用comment標籤git

3、模板語法之變量

在django模板中遍歷複雜數據結構的關鍵是句點字符,語法:{{ 變量名 }}。變量相似於python中的變量。數據庫

變量的命名包括任何字母數字以及下劃線("_")的組合。點(".")也有可能會在變量名中出現,不過它有特殊的含義。最重要的是,變量名稱中不能有空格或標點符號。

views.py:django

name='abc'
age=18
li=[1,2,'3','4']
dic={'name':'abc','age':18,''li:[1,2,4]}
def test():  #函數
    print('abc')
    return 'abchahahah'
class Person():
    def __init__(self,name,age)
        self.name=name
        self.age=age
    def get_name(self):
        return self.name
    @classmethod
    def cls_test(cls):
        return 'cls'
    @staticmethod
    def static_test():
        return 'static'
    ---------
    # 模板裏不支持帶參數
    def get_name_cs(self,ttt):
        return self.name
    ----------
    
zfj=Person('zfj',18)
qer=Person('qwe',28)
person_list=[zfj,qwe]

html:緩存

至關於print了該變量安全

<p>字符串:{{ name }}</p>
<p>數字:{{ age }}</p>
<p>列表:{{ li }}</p>
<p>元祖:{{ tu }}</p>
<p>字典:{{ dic }}</p>
<p>函數:{{ test }}</p>  {#只寫函數名:至關於函數名(),返回函數執行結果#}
<p>對象:{{ zfj }}</p>   {#對象內存地址#}

深度查詢:服務器

<p>列表第1個值:{{ ll.0 }}</p>
<p>列表第4個值:{{ ll.3 }}</p>
<p>字典取值:{{ dic.name }}</p>
<p>字典取列表值:{{ dic.li }}</p>
<p>對象取數據屬性:{{ zfj.name }}</p>
<p>對象取綁定給對象的函數屬性:{{ zfj.get_name }}</p>
<p>對象取綁定給類的函數屬性:{{ zfj.cls_test }}</p>
<p>對象取靜態方法:{{ zfj.static_test }}</p>

4、模板語言之過濾器

語法:數據結構

{{變量名|過濾器名稱:屬性值}}

過濾器能夠「連接」,一個過濾器的輸出應用於下一個過濾器{{text|escape|linebreaks}},先轉移文本內容,而後把文本轉成<p>標籤。

注:過濾器參數包含空格,必須用引號抱起來。

1.過濾器總覽

過濾器 說明
add 加法
addslashes 添加斜槓
capfirst 首字母大寫
center 文本居中
cut 切除字符
date 日期格式化
default 設置默認值
default_if_none 爲None設置默認值
dictsort 字典排序
dictsortreversed 字典反向排序
divisibleby 整除判斷
escape 轉義
escapejs 轉義js代碼
filesizeformat 文件尺寸人性化顯示
first 第一個元素
floatformat 浮點數格式化
force_escape 強制馬上轉義
get_digit 獲取數字
iriencode 轉換IRI
join 字符列表連接
last 最後一個
length 長度
length_is 長度等於
linebreaks 行轉換
linebreaksbr 行轉換
linenumbers 行號
ljust 左對齊
lower 小寫
make_list 分割成字符列表
phone2numeric 電話號碼
pluralize 複數形式
pprint 調試
random 隨機獲取
rjust 右對齊
safe 安全確認
safeseq 列表安全確認
slice 切片
slugify 轉換成ASCII
stringformat 字符串格式化
striptags 去除HTML中的標籤
time 時間格式化
timesince 從什麼時候開始
timeuntil 到什麼時候多久
title 全部單詞首字母大寫
truncatechars 截斷字符
truncatechars_html 截斷字符
truncatewords 截斷單詞
truncatewords_html 截斷單詞
unordered_list 無序列表
upper 大寫
urlencode 轉義url
urlize url轉成可點擊的連接
urlizetrunc urlize的截斷方式
wordcount 單詞計數
wordwrap 單詞包裹
yesno 將True,False和None,映射成字符串‘yes’,‘no’,‘maybe’

2.經常使用過濾器

default

若是變量是false或者爲空,則使用給定的默認值。

{{ value|default:'nothing'}}

length

返回值的長度,對字符串和列表都起做用

{{ value|length}} 若是value是[1,2,3,4],那麼輸出是4

filesizeformat

將值格式化成'人類可讀的'文件尺寸。例如:
{{1024|filesizeformat}}  輸出爲1kb

date

若是value=datetime.datetime.now()

{{ value|date:"Y-m-d"}}

slice

切片

{{ name|slice:'0:3:3' }}

truncatechars

若是字符串多餘指定字符數量,多餘會被截斷,替換成("...")結尾。

{{ value|truncatechars:9}}

safe

Django模板爲了安全默認會對HTML標籤和js等語法標籤進行轉義,有時候咱們不但願這些元素被轉義,能夠經過設置過濾器。

script="'<script>alert(111)</script>"
{{ script|safe }}

5、模板之標籤

一些在輸出中建立文本,一些經過循環或邏輯來控制流程,一些加載其後的變量將使用到的額外信息到模版中。一些標籤須要開始和結束標籤 (例如{% tag %} ...標籤 內容 ... {% endtag %})。
{% tag %}

1.內置標籤總覽

標籤 說明
autoescape 自動轉義開關
block 塊引用
comment 註釋
csrf_token CSRF令牌
cycle 循環對象的值
debug 調試模式
extends 繼承模版
filter 過濾功能
firstof 輸出第一個不爲False的參數
for 循環對象
for … empty 帶empty說明的循環
if 條件判斷
ifequal 若是等於
ifnotequal 若是不等於
ifchanged 若是有變化,則..
include 導入子模版的內容
load 加載標籤和過濾器
lorem 生成無用的廢話
now 當前時間
regroup 根據對象重組集合
resetcycle 重置循環
spaceless 去除空白
templatetag 轉義模版標籤符號
url 獲取url字符串
verbatim 禁用模版引擎
widthratio 寬度比例
with 上下文變量管理器

2.經常使用標籤

for標籤

遍歷每個元素

{% for person in person_list %}
    <p>{{ person }}</p>
{% end for%}

遍歷一個字典:

{% for k,v in dic.items %}
    <p>{{ k }}:{{ v }}</p>

下面是Django爲for標籤內置的一些屬性,能夠看成變量同樣使用{{ }}在模版中使用。

  • forloop.counter:循環的當前索引值,從1開始計數;經常使用於生成一個表格或者列表的序號!
  • forloop.counter0:循環的當前索引值,從0開始計數;
  • forloop.revcounter: 循環結束的次數(從1開始)
  • forloop.revcounter0 循環結束的次數(從0開始)
  • forloop.first:判斷當前是否循環的第一次,是的話,該變量的值爲True。咱們常常要爲第一行加點特殊的對待,就用得上這個判斷了,結合if。
  • forloop.last:若是這是最後一次循環,則爲真
  • forloop.parentloop:對於嵌套循環,返回父循環所在的循環次數。某些場景下,這是個大殺器,能解決你不少頭疼的問題。

for...empty

for標籤帶有一個可選的{% empty %}從句,在給出的組是空的或者沒有被找到時執行的操做

注:循環的對象是空,纔會走到empty,而不是對象裏面的東西爲空

{% for person in person_list %}
    <p>{{ person.name }}</p>

{% empty %}
    <p>sorry,no person here</p>
{% endfor %}

if

{% if %}會對一個變量求值,若是它的值是「True」(存在、不爲空、且不是boolean類型的false值),對應的內容塊會輸出。

{% if num > 100 or num < 0 %}
    <p>無效</p>
{% elif num > 80 and num < 100 %}
    <p>優秀</p>
{% else %}
    <p>湊活吧</p>
{% endif %}

注:在if標籤中使用括號是錯誤的語法,這點不一樣於Pythonif語句支持 ,優先級可使用if嵌套。if支持and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判斷。

with

使用一個簡單地名字緩存一個複雜的變量,當你須要使用一個「昂貴的」方法(好比訪問數據庫)不少次的時候是很是有用的

{% with total=business.employees.count %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}

6、自定義標籤和過濾器

Django爲咱們提供了自定義的機制,能夠經過使用Python代碼,自定義標籤和過濾器來擴展模板引擎,而後使用{% load %}標籤。

(一)、前置步驟

  1. 在settings中的INSTALLED_APPS配置當前app,否則django沒法找到自定義的simple_tag.

  2. 在app中新建一個templatetags包(名字固定),與views.py、models.py等文件在同一目錄下

    注:添加templatetags包後,須要從新啓動服務器,而後才能在模板中使用標籤或過濾器

  3. 建立任意 .py 文件,如:my_tags.py

  4. 要在模塊內自定義標籤,首先,這個模塊必須包含一個名爲register的變量,它是template.Library的一個實例,全部的標籤和過濾器都是在其中註冊的。 因此把以下的內容放在你的模塊的頂部:

from django.template import Library
register = Library()

templatetags包中放多少個模塊沒有限制。只須要記住{% load xxx %}將會載入給定模塊名中的標籤/過濾器,而不是app中全部的標籤和過濾器。

(二)、自定義模板過濾器

1.編寫過濾器

自定義過濾器就是一個帶有一個或兩個參數的python函數

注:函數的第一個參數是要過濾的對象,第二個是自定義參數,函數一共只能有兩個參數。

  • 變量的值:不必定是字符串形式
  • 能夠有一個初始值,或者不須要這個參數

例子:

def filter_multi(v1,v2):
    return  v1 * v2

2.註冊過濾器

定義好過濾器函數以後,須要註冊,方法是調用register.filter

register.filter('filter_multi',filter_multi)

Library.filter()方法須要兩個參數:

  • 過濾器的名稱:一個字符串對象
  • 編譯的函數 :你剛纔寫的過濾器函數

還能夠把register.filter()用做裝飾器,以以下的方式註冊過濾器:

@register.filter(name='yyy')
注:沒有聲明name參數,Django將使用函數名做爲過濾器的名字。

3.過濾器的使用方法

  1. 在要使用自定義過濾器的模板中導入建立的py文件。

    語法:{% load 文件名 %}

  2. 要使用的地方。{{'abc'|yyy:'qwe'}} 結果輸出abcqwe

(三)、自定義模板標籤

除了裝飾器,其它步驟與自定義過濾器類似。

@register.simple_tag()

過濾器只能有兩個參數,自定義標籤能夠傳多個值,空格傳值。

注:過濾器能夠用在if判斷中,標籤不能

7、模板繼承

模版繼承可讓您建立一個基本的「骨架」模版,它包含您站點中的所有元素,而且能夠定義可以被子模版覆蓋的 blocks 。

1.模板導入

語法:{% include'模板名稱' %}

如:{% include 'base.html' %}

<!DOCTYPE html>
<html lang="en">
<head>
    <link rel="stylesheet" href="style.css"/>
    <title>{% block title %}My amazing site{% endblock %}</title>
</head>

<body>
<div id="sidebar">
    {% block sidebar %}
        <ul>
            <li><a href="/">Home</a></li>
            <li><a href="/blog/">Blog</a></li>
        </ul>
    {% endblock %}
</div>

<div id="content">
    {% block content %}{% endblock %}
</div>
</body>
</html>

它定義了一個能夠用於兩列排版頁面的簡單HTML骨架。「子模版」的工做是用它們的內容填充空的blocks。

2.子模板中使用

語法:
{% block名字 %}
    子模板的內容
{% endblock %}
{% block content %}
    <p>這是子的區域</p>
    <p>這是子的區域</p>
    <p>這是子的區域</p>
    <p>這是子的區域</p>
{% endblock content%}

注:

  • 若是在模板中使用{% extends %}標籤,它必須是模板中的第一個標籤
  • 在base模板中設置越多的{% block %}標籤越好,子模板沒必要定義所有父模板中的blocks
  • 若是發現有大量的模板存在重複內容,能夠定義在父模板的{% block %}中。
  • 不能再一個模板中定義多個相同名字的block標籤
  • 爲了更好的可讀性,能夠給{% endblock %}設置一個名字
{% block content %}
{% endblock content%}

8、靜態文件相關

  1. 寫死靜態文件:

  2. 使用 static標籤函數:

    {% load static %}
    <link rel="stylesheet" href="{% static 'css/mycss.css' %}">
  3. 使用get_static_prefix 標籤

    {% load static %}
    <link rel="stylesheet" href="{% get_static_prefix %}css/mycss.css">
相關文章
相關標籤/搜索