1. 程式人生 > 實用技巧 >Python學習第144天(Django模板層)

Python學習第144天(Django模板層)

一.常用模板語法

{{ }}  變數相關
{% %} 邏輯相關

為模板傳值

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' %}

因為今天的操作只講了一半,所以重新複習了模板層的內容。