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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...