Python學習第144天(Django模板層)
阿新 • • 發佈:2020-08-03
{{ }} 變數相關
{% %} 邏輯相關
為模板傳值
1.通過字典的鍵值對指名道姓的一個個傳 return render(request, 'reg.html', {'n':n, 'f':f, ...}) 2.locals() 會將它所在的名稱空間中的所有名字都傳遞給指定模板 return render(request, 'reg.html', locals()) # 缺點:易造成資源浪費
注意
1.容器資料型別:前端獲取後端傳過來的容器型別的內部元素,統一採用句點符(.)
2.函式:後端傳函式名到前端,會自動加括號呼叫,但是不支援傳參
3.類:後端傳物件到前端,就相當於列印了這個物件,該物件可以通過點方法拿到類中方法的返回值(類名也一樣)
二.模板語法之 過濾器
原理:會將 | 前面的當做第一個引數傳入標籤中
1.{{ s|length }} 前端統計字串的長度 2.{{ flag|default:'你這個東西是個空'}} 前端獲取資料如果是空就返回default後面預設的引數值,必須要有兩個引數 3.{{ file_size|filesizeformat }} 將數字格式化成表示檔案大小的單位 4.{{ res|truncatewords:4 }} 按照空格擷取文字內容 5.{{ s|truncatechars:10 }} 擷取固定的長度的字串 三個點也算 6.{{ ctime|date:'Y-m-d' }} 只需要掌握年月日就可以了7.{{ l|slice:'0:5:2' }} 切分,可指定步長 8.{{ n|add:100 }} 相同資料型別相加,若不同返回空 9.取消轉義,告訴前端,後端傳過來的資料是安全的,可以識別HTML標籤展示 前端方法: {{ xxx|safe }} 後端方法: from django.utils.safestring import mark_safe xxx = mark_safe('<h1>我是h1標籤</h1>')
三.模板語法之標籤 {% %}
1.for 迴圈
{% for foo in l %} <p>{{ foo }}</p> <p>{{ forloop }}</p> {% endfor %}
2.empty
當你的for迴圈物件為空的時候會自動走empty程式碼塊兒的內容
後端: l = None 前端: {% for foo in l %} <p>{{ foo }}</p> {% empty %} <p>你給我的容器型別是個空啊,沒法for迴圈</p> {% endfor %}
3.if 判斷
{% if flag %} <p>flag不為空</p> {% else %} <p>flag是空</p> {% endif %}
4.for 與 if 巢狀使用
後端: l = [1,2,3,4] 前端: {% for foo in l %} {% if forloop.first %} <p>這是我的第一次</p> {% elif forloop.last %} <p>這是最後一次了啊</p> {% else %} p>嗨起來!!!</p> {% endif %} {% empty %} <p>你給我的容器型別是個空啊,沒法for迴圈</p> {% endfor %}
四.自定義 過濾器 標籤 inclusion_tag
注意:
# 自定義必需要做的三件事 1.在應用名下新建一個名為templatetags資料夾(必須叫這個名字) 2.在該新建的資料夾內新建一個任意名稱的py檔案 3.在該py檔案中需要固定寫下面兩句程式碼: from django import template register = template.Library() 注意: 必須先在需要使用的html頁面載入你的py檔案 {% load mytag %}
1.自定義過濾器
後端 建立
from django import template register = template.Library() @register.filter(name='myfilter') # name後面是過濾器名字 def index(a,b): # 過濾器只能有兩個引數 return a+b # 簡易版本的 |add
前端 使用
{% load mytag %} # mytag為建立的py檔案 {{ 2|myfilter:5 }} >>> 7
2.自定義標籤
後端 建立
from django import template register = template.Library() @register.simple_tag(name='xxx') def tag(a,b,c): # 標籤可以有多個引數 return '%s|%s|%s'%(a,b,c)
前端 使用
{% load mytag %} {% xxx 1 2 3 %} >>> 1|2|3
3.自定義 inclusion_tag
為什麼用?
當你的頁面上有一部分html程式碼需要經常被各個地方使用,並且需要傳參才能渲染出來,那麼你可以把該html程式碼部分製作成一個inclusion_tag
後端 建立
from django import template register = template.Library() @register.inclusion_tag('bigplu.html') def bigplu(n): l = [] for i in range(0,10): l.append(i) return {'l':l}
前端 使用
bigplu.html 頁面 <ul> {% for foo in l %} <li>{{ foo }}</li> {% endfor %} </ul>
reg.html 頁面 {% load mytag %} {% bigplu 5 %}
五.模板的繼承與匯入
模板繼承 extends
什麼是模板的繼承?
當多個頁面整體的樣式都大差不差的情況下,可以設定一個模板檔案,在該模板檔案中,使用block塊劃分多個預期,
之後子版在使用模板的時候,可以通過block塊的名字,來選定到底需要修改哪一部分割槽域
如何使用?
<!--第一步: 首先需要在被繼承的模板中劃分多個區域--> {% block 給區域起的名字 %} 區域程式碼塊 {% endblock %}
<!--第二步:繼承模板所有的內容--> {% extends 'home.html' %}
<!--第三步:根據block塊的名字修改指定區域的內容--> {% block content %} <h1>登入頁面</h1> <form action=""> <p>username:<input type="text" class="form-control"></p> <p>password:<input type="text" class="form-control"></p> <input type="submit" class="btn btn-success"> </form> {% endblock %}
<!--ps:通常情況下一個模板中應該至少有三塊,一般情況下,模板上的block越多,頁面的可擴充套件性就越強--> {% block css %} 頁面css程式碼塊 {% endblock %} {% block content %} 頁面主體內容 {% endblock %} {% block js %} 頁面js程式碼塊 {% endblock %}
模板匯入 include
為什麼使用?
當你寫了一個特別好看的form表單/列表標籤等,可以將它當成一個模組,哪個地方需要,就直接匯入使用即可
如何使用?
<!--將一段html當做模組的方式匯入到另一個html展示--> {% include 'beautiful.html' %}
因為今天的操作只講了一半,所以重新複習了模板層的內容。