python 之 Django框架(模板系統、過濾器、simple_tag、inclusion_tag、Tags、母版、組件)

来源:https://www.cnblogs.com/mylu/archive/2019/09/02/11449061.html
-Advertisement-
Play Games

12.35 Django模板系統 {{ }}和 {% %},變數相關的用{{}},邏輯相關的用{%%} app02/views: template_test.html: 在Django的模板語言中,通過使用過濾器來改變變數的顯示,過濾器的語法: {{ value|filter_name:參數 }} ...


12.35 Django模板系統

{{ }}和 {% %},變數相關的用{{}},邏輯相關的用{%%}

app02/views:

# 模板語言測試函數
def template_test(request):
    name = "張三"
    dic = {"name": "張三", "age": 16, "items": "sb"}
    list1 = [11, 22, 33, 44, 55]
​
    class Person(object):
        def __init__(self, name):
            self.name = name
​
        def dream(self):
            return "{}在做白日夢".format(self.name)
    p1 = Person("張三豐")
    import datetime
    today = datetime.datetime.today()
​
    return render(
        request,
        "template_test.html",
        {
            "name": name,
            "dic": dic,
            "list": list1,
            "obj": p1,
            "box": "黑盒子",
            "filesize": 1234567890,
            "today": today,
            "str": "<script>alert(123)</script>",
            "words": """
                先帝創業未半而中道崩殂
            """
        }
    )

template_test.html:

{{ dic.name }} {{ dic.age }}    #張三  16
{{ dic.items }}                #Django的模板語言中屬性的優先順序大於方法的優先順序  sb
{{ obj.name }}                 #張三豐
{{ obj.dream }}                #張三豐在做白日夢   模板語言中調用綁定方法不需要加括弧
12.351 過濾器

在Django的模板語言中,通過使用過濾器來改變變數的顯示,過濾器的語法: {{ value|filter_name:參數 }}

使用管道符"|"來應用過濾器

例如:{{ name|lower }}會將name變數應用lower過濾器之後再顯示它的值。lower在這裡的作用是將文本全都變成小寫。

template_test.html:

<body>
{{ list }}                     #[11, 22, 33, 44, 55]
{{ list.0 }}                   #索引取值:11
{{ list|first }}               # 11
{{ list|length }}              #返回值的長度,作用於字元串和列表  5
{{ list|slice:"2:-1" }}         #切片:[33,44]
{{ ['a','b']|join:"*" }}        #"a*b"
{{ box|default:"空盒子" }}      #如果box沒有傳值或者值為空的話就顯示預設值,否則使用變數的值
{{ filesize|filesizeformat }}   #格式化文件大小  1.1G
{{ today|date:"Y-m-d H:i:s" }}  #格式化日期格式  
{{ str|safe }}                  #取消轉義,直接應用HTML標簽
{{ words|truncatechars:9 }}     #字元串字元多於指定的字元數量會被截斷,截斷的字元串將以(“...”)結尾
{{ words|truncatewords:9}}      #在一定數量的字後截斷字元串,截斷的字元串將以(“...”)結尾
{{ i love you|cut:' ' }}        #移除value所有的與給出的變數相同的字元串,輸出'iloveyou'
{{ 1|add:1 }}                  # 2  #add可以數字加法,拼接字元串,拼接列表
{{ name|upper }}               # NAME
​
</body>

timesince:將日期格式設為自該日期起的時間(例如,“4天,6小時”),blog_date是表示2006年6月1日午夜的日期實例,並且comment_date是2006年6月1日08:00的日期實例,則以下將返回“8小時”:

{{ blog_date|timesince:comment_date }}
12.352 自定義filter
app02:
    __init__.py
    models.py
    templatetags:         # 在app02下麵新建一個名為templatetags的(Python package)包
        __init__.py
        app02_filters.py  # 建一個存放自定義filter的文件
    views.py

編寫自定義filter:

app02_filters.py :

from django import template
register = template.Library()   # 生成一個用於註冊自定義filter方法的實例
​
@register.filter(name="sb")
def add_sb(value):
    return "{} sb".format(value)
​
@register.filter(name="cut")
def cut(value, arg):
    return value.replace(arg, "")

template_test.html:

{% load app02_filters %}        # 先導入我們自定義filter那個文件 
​
{{ name }}                      #張三
{{ name|sb }}                   #張三 sb
{{ name|cut:"三" }}              #張

註意:

過濾器支持“鏈式”操作。即一個過濾器的輸出作為另一個過濾器的輸入。 過濾器可以接受參數,例如:{{ sss|truncatewords:30 }},這將顯示sss的前30個詞。 過濾器參數包含空格的話,必須用引號包裹起來。比如使用逗號和空格去連接一個列表中的元素,如:{{ list|join:', ' }} ':'左右沒有空格

12.353 simple_tag

和自定義filter類似,但接收更靈活的參數

定義註冊simple_tag:文件名:app01_my_simple_tags

from django import template
register = template.Library()   # 生成一個用於註冊simple_tag自定義方法的實例
​
@register.simple_tag(name="plus")
def plus(a, b, c):
    return "{} + {} + {}".format(a, b, c)

使用自定義simple_tag:

{% load app01_my_simple_tags %}{% plus "1" "2" "abc" %}    #"12abc"
12.354 inclusion_tag

多用於返回html代碼片段

templatetags/inclusion_tag_test.py:

from django import template
register = template.Library()
​
@register.inclusion_tag('result.html')
def show_results(n):
    n = 1 if n < 1 else int(n)
    data = [ for i in range(1, n+1)]
    return {"data": data}           #用字典給result.html傳值

templates/result.html:

<ul>
  {% for i in data %}
    <li>{{ i }}</li>
  {% endfor %}
</ul

templates/index.html:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>inclusion_tag test</title>
</head>
<body>
{% load inclusion_tag_test %}   #導入 inclusion_tag文件
{% show_results 10 %}
</body>
</html>
12.355 Tags

for迴圈:

<ul>
{% for user in user_list %}
    <li>{{ forloop.counter }}</li>          #當前迴圈的索引值(從1開始)
    <li>{{ forloop.counter0 }}</li>         #當前迴圈的索引值(從0開始)
    <li>{{ forloop.revcounter }}</li>       #當前迴圈的倒序索引值(從1開始)
    <li>{{ forloop.revcounter0 }}</li>      #當前迴圈的倒序索引值(從0開始)
    #{% if forloop.first %}                #當前迴圈是不是第一次迴圈(布爾值)
    {% if forloop.last %}                  #當前迴圈是不是最後一次迴圈(布爾值)
        <li>{{ user.name }}</li>
    {% else %}
        <li>xxxxx</li>
    <% endif %>
{% empty %}                               #if語句都沒執行時執行empty
    xxxxx
{% endfor %}
</ul>

with: 定義一個中間變數,多用於給一個複雜的變數起別名

{% with total=business.employees.count %}       #註意等號左右不要加空格。
    {{ total }} employee{{ total|pluralize }}
{% endwith %}{% with business.employees.count as total %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}

for ... empty:

<ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% empty %}
    <li>空空如也</li>
{% endfor %}
</ul>
12.356 母版

新建一個HTML文件(base.html),將公用的標簽放在base.html中作為母版,其他子頁面可以繼承此母版,避免代碼的重覆和多次修改

base.html:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="x-ua-compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Title</title>
  {% block page-css %}
  
  {% endblock %}
</head>
<body>
{#導航條 開始#}
{% include 'nav.html' %}
{#導航條 結束#}
<h1>這是母板的標題</h1>
{% block page-content %}
​
{% endblock %}
<h1>母板底部內容</h1>
{% block page-js %}
​
{% endblock %}
</body>
</html>

註意:我們通常會在母板中定義頁面專用的CSS塊和JS塊,方便子頁面替換。

繼承母板:

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

{% extends 'base.html' %}
{% block page-content %}
.....
{% endblock %}

組件:

可以將常用的頁面內容如導航條,頁尾信息等組件保存在單獨的文件中,然後在需要使用的地方按如下語法導入即可:

nav.html:導航條

<nav class="navbar navbar-inverse navbar-fixed-top">
    .......
</nav>

xxx.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
​
{% include 'nav.html' %}                #在使用時通過{% include 組件文件 %}來引入公用組件
<div class="container">
    <div class="row">
        <div class="page-header ">
            <h1 class="text-center">新增作者信息</h1>
            <div class="col-md-6 col-md-offset-3">
            .......
            </div>
        </div>
    </div>
</div>
</body>
</html>

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

-Advertisement-
Play Games
更多相關文章
  • 字元集分為:ASCII碼 GBK Unicode(萬國碼) utf-8; ASCII碼是國外版,僅支持英文編碼,一個英文占用一位(byte); GBK 是國人補充的編碼,支持中文的書寫,一個字元占用兩位(byte); Unicode 是將多個國家的編碼進行統一整合,但是一個英文占用兩位(byte); ...
  • Spring Security 解析(四) —— 簡訊登錄開發   在學習Spring Cloud 時,遇到了授權服務oauth 相關內容時,總是一知半解,因此決定先把Spring Security 、Spring Security Oauth2 等許可權、認證相關的內容、原理及設 ...
  • 今天是Python基礎數據類型的最後一課,今天主要學習的知識是文件。文件主要分為讀文件,寫文件,讀寫文件,寫讀文件..... 首先我們來說只讀文件 我們先看下絕對路徑下的讀文件: open(1,2,3):打開文件,open()裡面的第一個參數是路徑的意思,你存儲的文件絕對路徑,裡面第二個參數是模式, ...
  • 鄙人為興趣愛好,0基礎入門學習Java,有些心得想法,記錄於此,與君分享。 然畢竟新手,學識尚淺,錯誤之處,希望多多指正批評,也是對我最大的幫助! 前言:本篇文章,主要討論在子類繼承父類之後,各屬性成員和方法的特征規律和差異,this和super的異同,以及一些繼承在記憶體中構建的過程。 文章內所有內 ...
  • springmvc:是完成數據的封裝和跳轉的功能 流程圖如下: springmvc的配置流程 1、導入jar包 二、配置servlet文件 init-param的作用是在啟動servlet啟動時規定其地地址及名稱去搜尋其springmvc配置文件 三、配置springmvc配置文件 進行handle ...
  • 前言 當共用變數被聲明為volatile後,對這個變數的讀/寫操作都會很特別,下麵我們就揭開volatile的神秘面紗。 1.volatile的記憶體語義 1.1 volatile的特性 一個volatile變數自身具有以下三個特性: 1. 可見性:即當一個線程修改了聲明為volatile變數的值,新 ...
  • 前言 在說深淺拷貝之前,我們要明白以下原因是怎麼產生的: 為什麼a的數值就會變呢,我只是在b中添加了一個數值15,怎麼a中也會添加一個15呢?原來python中所採用的的引用的方法,就是說a變數只是指向[13,14]這一個地址,當b = a時,並沒有重新開闢一個新的地址,而是將b指向[13,14]這 ...
  • 瞭解PHP 瞭解神器: PhpStudy 一鍵搭建PHP環境 語法: ​ PHP是一種可以嵌套在HTML頁面的腳本語言 嵌套HTML文件: PHP同時也可以以 “ .php” 文件單獨保存和被訪問,但是在php文件中,也必須以 “”結束!php代碼只會在這裡被執行和解析 PHP對大小寫敏感識別 PH ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...