django之模板層

来源:https://www.cnblogs.com/setcreed/archive/2019/11/26/11938800.html
-Advertisement-
Play Games

[TOC] 模板語法 兩種書寫格式: 變數相關 {{ }} 邏輯相關 {% %} 模板傳值 給html頁面傳值的兩種方式 第一種方式 弊端就是:當要傳的變數名很多的時候,就很麻煩 第二種 locals() locals() 會將當前所在的名稱空間中所有的名字全部傳遞給html頁面 傳值 基本數據類型 ...


目錄

模板語法

兩種書寫格式:

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

模板傳值

給html頁面傳值的兩種方式

第一種方式

def test(request):
    n = 1
    f = 1.21
    s = 'hellow world'
    lt = [11, 22, 33, 44, 55, 66]
    tu = (111, 222, 333)
    dic = {'username': 'neo', 'password': '123'}
    se = {1, 3, 5, 7, 9}
    bo = True

    return render(request, 'test.html', 'n': n, 'dic': dic)

弊端就是:當要傳的變數名很多的時候,就很麻煩

第二種 locals()

locals() 會將當前所在的名稱空間中所有的名字全部傳遞給html頁面

傳值 基本數據類型

def test(request):
    n = 1
    f = 1.21
    s = 'hellow world'
    lt = [11, 22, 33, 44, 55, 66]
    tu = (111, 222, 333)
    dic = {'username': 'neo', 'password': '123'}
    se = {1, 3, 5, 7, 9}
    bo = True

    return render(request, 'test.html', locals())

前端接收:

<p>{{ n }}</p>
<p>{{ f }}</p>
<p>{{ lt }}</p>
<p>{{ tu }}</p>
<p>{{ s }}</p>
<p>{{ se }}</p>
<p>{{ bo }}</p>
<p>{{ dic }}</p>

傳函數名

def test(request):
    def func1():
        pass
    
    return render(request, 'test.html', locals())

前端

<p>傳函數名 {{ func1 }}</p>

顯示效果:傳函數名 None

註意:

  • 給HTML頁面傳遞函數名的時候,模板語法會自動加括弧調用該函數,並且將函數的返回值顯示在瀏覽器頁面上

  • 但是模板語法不支持函數傳參,意味著給html頁面傳的函數只能是不需要傳參數調用的函數。

傳類名和對象

    def func1():
        pass


    class MyClass(object):
        def get_self(self):
            return 'get_self'

        @classmethod
        def get_cls(cls):
            return 'get_cls'

        @staticmethod
        def get_func():
            return 'get_func'

    obj = MyClass()

前端:

<p>傳類名:{{ MyClass }}</p>
<p>傳對象名: {{ obj }}</p>

<p>{{ obj.get_cls }}</p>
<p>{{ obj.get_self }}</p>
<p>{{ obj.get_func }}</p>

總結:只要是能夠加括弧調用的 傳遞到html頁面上都會自動加括弧調用

過濾器

語法結構

|來使用, 會自動將 | 左邊的數據當作過濾器的第一個參數傳入, :右邊的當作第二個參數

<p>統計長度:{{ s|length }}</p>

常用的方法

  • 統計長度<p>統計長度:{{ s|length }}</p>, 如果無法統計長度會預設返回0
  • 加法運算:{{ n|add:666 }}, 內部異常捕獲 支持數字相加 字元串拼接 都不符合返回空
  • 切片操作:{{ lt|slice:'0:5:2' }}, 顧頭不顧尾 也支持步長
  • 自動轉成文件大小格式{{ file_size|filesizeformat }}
  • 截取文本內容:s|truncatechars:5 (按字元計算)截取五個字元,三個點也算
  • 截取文本內容:{{ s1|truncatewords:5 }}, (按照空格計算) 截取五個單詞 三個點不算
  • 判斷是否有值:{{ is_value|default:'is_value變數名指向的值為空' }}, 有值展示值本身 沒值展示預設值
  • 展示帶有標簽的文本{{ sss }}
    • 預設情況下 是不會自動轉換成前端html標簽,防止惡意攻擊

前後端取消轉義

前端:<p>{{ sss|safe}}</p> 這樣就可以自動轉換成前端html標簽

後端:

from django.utils.safestring import mark_safe

def test(request):
    sss2 = "<h2>h2標簽</h2>"
    res = mark_safe(sss2)
    
    return render(request, 'test.html', locals())


# 前端傳res就行了

也就意味著 html代碼可以不在html文件內寫,可以在後端寫完了傳給前端

標簽

邏輯相關的語法

for迴圈:

<p>標簽  邏輯相關</p>
{% for foo in lt %}
    <p>{{ forloop }}</p>
    <p>{{ foo }}</p>
{% endfor %}

forloop 內置的對象:

{'parentloop': {}, 'counter0': 0, 'counter': 1, 'revcounter': 6, 'revcounter0': 5, 'first': True, 'last': False}

if判斷

{% if s %}
<p>s有值</p>
    {% else %}
    <p>s沒有值</p>
{% endif %}

for迴圈和if判斷聯合使用

{% for foo in lt %}
    {% if forloop.first %}
        <p>第一次</p>
    {% elif forloop.last %}
        <p>最後一次</p>
    {% else %}
        <p>{{ foo }}有點意思</p>

    {% endif %}
{% endfor %}
{% empty %}
<p>當for迴圈的對象是空的時候會走 </p>

with起別名

後端有個大字典,傳到前端:

comp_dic = {'username':'123', 'hobby':['study', 'run', ['rap', {'age':20}]]}

前端: <p>{{ comp_dic.hobby.2.1.age }}</p>

註意:模板語法的取值 只有一種方式 統一採用句點符

<p>當你的數據是通過多個句點符獲取到的,後續又需要經常使用,可以給該數據起別名,但別名只能在with內部使用</p>
{% with comp_dic.hobby.2.1.age as age %}
    <p>{{ age }}</p>

{% endwith %}

自定義過濾器和標簽

django支持用戶自定義過濾器和標簽

有三個步驟:

  • 在應用名下新建一個名字必須叫做templatetags的文件夾

  • 在該文件夾內,新建一個任意名稱的py文件

  • 在該py文件中,必須先寫下麵兩句代碼

    from django.template import Library
    
    register = Library()

之後就可以用register自定義過濾器和標簽了

自定義過濾器

和預設的過濾器一樣 最多只能接受兩個參數

from django.template import Library

register = Library()

# 自定義過濾器
@register.filter(name='neo')
def index(a, b):
    return a + b    # 兩個數的和

需要先在html頁面上 載入

{% load mytag %}
{{ 1|neo:2 }}

自定義的過濾器可以在邏輯語句中使用,而自定義的標簽不可以

{% load mytag %}
{% if 1|neo:2 %}
    <p>有值</p>
    {% else %}
    <p>沒有值</p>

{% endif %}

自定義標簽

可以接收任意多個參數,參數與參數之間必須空格隔開

from django.template import Library

register = Library()

@register.simple_tag(name='mytag')
def mytag(a,b,c,d):
    return '%s*%s*%s*%s' % (a,b,c,d)   # 接收四個參數用*拼接

自定義inclusion_tag

是一個函數,能夠接收外界傳入的參數,然後傳遞給一個頁面,頁面上獲取數據,渲染完成之後,將渲染好的頁面放到調用inclusion_tag的地方。

mytag.py

from django.template import Library

register = Library()
@register.inclusion_tag('mytag.html', name='xxx')
def func(n):
    lt = []
    for i in range(n):
        lt.append(f'第{i}項')

    return locals()   # 將lt直接傳遞給mytag頁面

template文件夾下mytag.html

<ul>
    {% for foo in lt %}
        <li>{{ foo }}</li>
    {% endfor %}

</ul>

views.py返回的test.html頁面

{% load  mytag %}
{% xxx 5 %}

註意: 當你需要使用一些頁面組件的時候 並且該頁面組件需要參數才能夠正常渲染 你可以考慮使用inclusion_tag

模板的繼承

繼承模板extends

在子頁面中在頁面最上方使用下麵的語法來繼承母板

{% extends 'home.html' %}

塊(block)

在父頁面上利用block劃定想要修改的區域,繼承後就可以通過名字找到對應的名字找到該區域,並修改

  1. 模板上的block區域越多,頁面的擴展性越強,推薦你一個模板頁面至少有三塊區域(css區域,html代碼區域,js區域)
  2. 通過這三個區域,就能夠實現每一個頁面都有自己獨立的css和js代碼
  3. 可以在子頁面上通過{{ block.super }}沿用父頁面的內容

導入(include)

將html頁面當做模塊的直接導入使用:{% include 'form.html'%}

{% block content %}
    <p>我改成home1頁面內容</p>
    {{block.super}}
    {% include 'form.html' %}
{% endblock %}

{% block css %}
    <style>
        p {
            color: green;
        }
    </style>
{% endblock %}

{% block js %}
    <script>
        alert('login')
    </script>
{% endblock %}

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 爬取51Job和獵聘網的信息,想處理字元集問題(51job為gbk,獵聘為utf-8), 找到兩個網站字元集信息都在同一標簽下 就想先把網頁保存成String,解析一遍獲取字元集,然後將網頁轉換成對應的正確的字元集,最後再轉換成統一的字元集utf-8 1.0實現,2次調用Entity.Utils.t ...
  • 0.前言 代碼目錄: https://github.com/brandon rhodes/fopnp/tree/m/py3 0.1.網路實驗環境:理解客戶端與伺服器是如何通過網路進行通信的 每台機器通過一個Docker容器實現 0.1.1.數據機A和B下麵的客戶機(h1~h4)表示典型客戶端場景 ...
  • https://blog.csdn.net/weixin_42336574/article/details/95485622 https://dingtalk-sdk.readthedocs.io/zh_CN/latest/client/api/calendar.html https://blog. ...
  • 給定一個整數,輸出這個整數所有的可能加和,按從小到大排序 例:給定整數7 輸出: 1+1+1+1+1+1+1 1+1+1+1+1+2 1+1+1+1+3 1+1+1+2+2 1+1+1+4 1+1+2+3 1+1+5 1+2+4 1+3+3 1+6 2+5 3+4 7 實現一: 1 #include ...
  • 現有列表a, a中元素是如[x,y]格式的數組,代表一段數字區間, 如[1,3]表示從1到3之間的任何數字 判斷給定的新數字區間new_element(例如: [10, 25])能不能添加到列表a中,返回True or False 要求任何被添加進入列表a的新數字區間,必須滿足以下條件: 新插入的數 ...
  • 1、下載 httpd-2.4.41-win64-VC15.zip、php5.6、php7.3 2、配置httpd,在 httpd.conf L180 添加如下代碼: 3、分別在 php5.6、php7.3中配置 php.ini 4、以管理員身份打開cmd 5、這樣就可以在任務管理器中隨意切換php5 ...
  • 之前有人詢問 self 關鍵字的用法,答案是比較明顯的:靜態成員函數內不能用 this 調用非成員函數,但可以用 self 調用靜態成員函數/變數/常量;其他成員函數可以用 self 調用靜態成員函數以及非靜態成員函數。隨著討論的深入,發現 self 並沒有那麼簡單。鑒於此,本文先對幾個關鍵字做對比 ...
  • 1.什麼是redis? Redis 是一個基於記憶體的高性能key-value資料庫。 2.Reids的特點 Redis本質上是一個Key-Value類型的記憶體資料庫,很像memcached,整個資料庫統統載入在記憶體當中進行操作,定期通過非同步操作把資料庫數據flush到硬碟上進行保存。因為是純記憶體操作 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...