Django模板語言相關內容

来源:https://www.cnblogs.com/hxf175336/archive/2018/07/23/9352938.html
-Advertisement-
Play Games

Django模板系統 官方文檔:https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#std:templatetag-for 常用語法 只需要記兩種特殊符號: {{ }}和 {% %} 變數相關的用{{}},邏輯相關的用{%%} ...


Django模板系統

官方文檔:https://docs.djangoproject.com/en/1.11/ref/templates/builtins/#std:templatetag-for

常用語法

只需要記兩種特殊符號:

{{  }}和 {% %}

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

變數

{{ 變數名 }}

變數名由字母數字和下劃線組成。

點(.)在模板語言中有特殊的含義,用來獲取對象的相應屬性值。

幾個例子:

view中代碼:

複製代碼
def template_test(request):
    l = [11, 22, 33]
    d = {"name": "alex"}

    class Person(object):
        def __init__(self, name, age):
            self.name = name
            self.age = age

        def dream(self):
            return "{} is dream...".format(self.name)

    Alex = Person(name="Alex", age=34)
    Egon = Person(name="Egon", age=9000)
    Eva_J = Person(name="Eva_J", age=18)

    person_list = [Alex, Egon, Eva_J]
    return render(request, "template_test.html", {"l": l, "d": d, "person_list": person_list})
複製代碼

模板中支持的寫法:

複製代碼
{# 取l中的第一個參數 #}
{{ l.0 }}
{# 取字典中key的值 #}
{{ d.name }}
{# 取對象的name屬性 #}
{{ person_list.0.name }}
{# .操作只能調用不帶參數的方法 #}
{{ person_list.0.dream }}
複製代碼

Filters

語法: {{ value|filter_name:參數 }}

default

{{ value|default: "nothing"}}

如果value值沒傳的話就顯示nothing

length

{{ value|length }}

'|'左右沒有空格沒有空格沒有空格

返回value的長度,如 value=['a', 'b', 'c', 'd']的話,就顯示4.

filesizeformat

將值格式化為一個 “人類可讀的” 文件尺寸 (例如 '13 KB''4.1 MB''102 bytes', 等等)。例如:

{{ value|filesizeformat }}

如果 value 是 123456789,輸出將會是 117.7 MB。

slice

切片

{{value|slice:"2:-1"}}

date

格式化

{{ value|date:"Y-m-d H:i:s"}}

safe

Django的模板中會對HTML標簽和JS等語法標簽進行自動轉義,原因顯而易見,這樣是為了安全。但是有的時候我們可能不希望這些HTML元素被轉義,比如我們做一個內容管理系統,後臺添加的文章中是經過修飾的,這些修飾可能是通過一個類似於FCKeditor編輯加註了HTML修飾符的文本,如果自動轉義的話顯示的就是保護HTML標簽的源文件。為了在Django中關閉HTML的自動轉義有兩種方式,如果是一個單獨的變數我們可以通過過濾器“|safe”的方式告訴Django這段代碼是安全的不必轉義。

比如:

value = "<a href='#'>點我</a>"

{{ value|safe}}

truncatechars

如果字元串字元多於指定的字元數量,那麼會被截斷。截斷的字元串將以可翻譯的省略號序列(“...”)結尾。

參數:截斷的字元數

{{ value|truncatechars:9}}

自定義filter

自定義過濾器只是帶有一個或兩個參數的Python函數:

  • 變數(輸入)的值 - -不一定是一個字元串
  • 參數的值 - 這可以有一個預設值,或完全省略

例如,在過濾器{{var | foo:“bar”}}中,過濾器foo將傳遞變數var和參數“bar”

 

自定義filter代碼文件擺放位置:

複製代碼
app01/
    __init__.py
    models.py
    templatetags/  # 在app01下麵新建一個package package
        __init__.py
        app01_filters.py  # 建一個存放自定義filter的文件
    views.py
複製代碼

編寫自定義filter

複製代碼
from django import template
register = template.Library()


@register.filter(name="cut")
def cut(value, arg):
    return value.replace(arg, "")


@register.filter(name="addSB")
def add_sb(value):
    return "{} SB".format(value)
複製代碼

使用自定義filter

{# 先導入我們自定義filter那個文件 #}
{% load app01_filters %}

{# 使用我們自定義的filter #}
{{ somevariable|cut:"0" }}
{{ d.name|addSB }}

Tags

for

<ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% endfor %}
</ul>

for迴圈可用的一些參數:

VariableDescription
forloop.counter 當前迴圈的索引值(從1開始)
forloop.counter0 當前迴圈的索引值(從0開始)
forloop.revcounter 當前迴圈的倒序索引值(從1開始)
forloop.revcounter0 當前迴圈的倒序索引值(從0開始)
forloop.first 當前迴圈是不是第一次迴圈(布爾值)
forloop.last 當前迴圈是不是最後一次迴圈(布爾值)
forloop.parentloop 本層迴圈的外層迴圈

for ... empty

複製代碼
<ul>
{% for user in user_list %}
    <li>{{ user.name }}</li>
{% empty %}
    <li>空空如也</li>
{% endfor %}
</ul>
複製代碼

if,elif和else

複製代碼
{% if user_list %}
  用戶人數:{{ user_list|length }}
{% elif black_list %}
  黑名單數:{{ black_list|length }}
{% else %}
  沒有用戶
{% endif %}
複製代碼

當然也可以只有if和else

{% if user_list|length > 5 %}
  七座豪華SUV
{% else %}
    黃包車
{% endif %}

if語句支持 and 、or、==、>、<、!=、<=、>=、in、not in、is、is not判斷。

with

定義一個中間變數

{% with total=business.employees.count %}
    {{ total }} employee{{ total|pluralize }}
{% endwith %}

csrf_token

這個標簽用於跨站請求偽造保護。

在頁面的form表單裡面寫上{% csrf_token %}

註釋

{# ... #}

註意事項

1. Django的模板語言不支持連續判斷,即不支持以下寫法:

{% if a > b > c %}
...
{% endif %}

 

2. Django的模板語言中屬性的優先順序大於方法

def xx(request):
    d = {"a": 1, "b": 2, "c": 3, "items": "100"}
    return render(request, "xx.html", {"data": d})

如上,我們在使用render方法渲染一個頁面的時候,傳的字典d有一個key是items並且還有預設的 d.items() 方法,此時在模板語言中:

{{ data.items }}

預設會取d的items key的值。

母板

複製代碼
<!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>

<h1>這是母板的標題</h1>

{% block page-main %}

{% endblock %}
<h1>母板底部內容</h1>
{% block page-js %}

{% endblock %}
</body>
</html>
複製代碼

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

繼承母板

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

{% extends 'layouts.html' %}

塊(block)

通過在母板中使用{% block  xxx %}來定義"塊"。

在子頁面中通過定義母板中的block名來對應替換母板中相應的內容。

{% block page-main %}
  <p>世情薄</p>
  <p>人情惡</p>
  <p>雨送黃昏花易落</p>
{% endblock %}

組件

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

{% include 'navbar.html' %}

靜態文件相關

{% load static %}
<img src="{% static "images/hi.jpg" %}" alt="Hi!" />

引用JS文件時使用:

{% load static %}
<script src="{% static "mytest.js" %}"></script>

某個文件多處被用到可以存為一個變數

{% load static %}
{% static "images/hi.jpg" as myphoto %}
<img src="{{ myphoto }}"></img>

使用get_static_prefix

{% load static %}
<img src="{% get_static_prefix %}images/hi.jpg" alt="Hi!" />

或者

{% load static %}
{% get_static_prefix as STATIC_PREFIX %}

<img src="{{ STATIC_PREFIX }}images/hi.jpg" alt="Hi!" />
<img src="{{ STATIC_PREFIX }}images/hi2.jpg" alt="Hello!" />

 自定義simpletag

和自定義filter類似,只不過接收更靈活的參數。

定義註冊simple tag

@register.simple_tag(name="plus")
def plus(a, b, c):
    return "{} + {} + {}".format(a, b, c)

使用自定義simple tag

{% load app01_demo %}

{# simple tag #}
{% plus "1" "2" "abc" %}

inclusion_tag

多用於返回html代碼片段

示例:

templatetags/my_inclusion.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 = ["第{}項".format(i) for i in range(1, n+1)]
    return {"data": data}
複製代碼

templates/snippets/result.html

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

templates/index.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>inclusion_tag test</title>
</head>
<body>

{% load inclusion_tag_test %}

{% show_results 10 %}
</body>
</html>
複製代碼
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 功能:停止事件冒泡 function stopBubble(e) { // 如果提供了事件對象,則這是一個非IE瀏覽器 if ( e && e.stopPropagation ) { // 因此它支持W3C的stopPropagation()方法 e.stopPropagation(); } els ...
  • 1、JavaScript對象的創建方式 在JavaScript中,創建對象的方式包括兩種:對象字面量和使用new表達式。對象字面量是一種靈活方便的書寫方式,例如: 1 2 3 4 5 6 var o1 = { p:”I’m in Object literal”, alertP:function(){ ...
  • 1、萬惡的回調 對前端工程師來說,非同步回調是再熟悉不過了,瀏覽器中的各種交互邏輯都是通過事件回調實現的,前端邏輯越來越複雜,導致回調函數越來越多,同時 nodejs 的流行也讓 javascript 在後端的複雜場景中得到應用,在 nodejs 代碼中更是經常看到層層嵌套。非同步操作的回調一旦嵌套很多 ...
  • ruby 標記定義ruby註釋(中文註音或字元)。ruby標記與rt標記一同使用。ruby標記由一個或多個字元(需要一個解釋/發音)和一個提供該信息的rt 標記組成,還包括可選的rp標記,定義當瀏覽器不支持ruby 標記時顯示的內容。 基本語法: 效果圖: 註意: 基本語法內rp標記與rt標記要註意 ...
  • guava是google的一個開源java框架,其github地址是 https://github.com/google/guava。guava工程包含了若幹被Google的 Java項目廣泛依賴的核心庫,例如:集合 [collections] 、緩存 [caching] 、原生類型支持 [prim ...
  • 電商支付架構設計交易核心支付編排------------------------------------------------------------------今天先到這兒,希望對您技術領導力, 企業管理,系統架構設計與評估,團隊管理, 項目管理, 產品管理,團隊建設 有參考作用 , 您可能感興... ...
  • 介紹單例模式之前我們先來介紹下什麼是設計模式,所謂設計模式簡單來說就是根據開發者先輩們的經驗而總結出的解決問題的方式,可以說是前人經驗和心血的體現。 有了設計模式之後,我們可以少走很多彎路,利用設計模式來輕鬆解決對應的問題。 話不多說,今天先來介紹最容易入門和掌握的設計模式——單例模式 單例模式:我 ...
  • 在學完volatile和CAS之後,近幾天在擼AbstractQueuedSynchronizer(AQS)的源代碼,很多併發工具都是基於AQS來實現的,這也是併發專家Doug Lea的初衷,通過寫一個這樣的基礎工具來提高j.u.c的靈活性。具體可以看這篇論文的一段原文,我摘錄一下: As is w ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...