02.Django-模板

来源:https://www.cnblogs.com/yanadoude/archive/2020/06/09/13081770.html
-Advertisement-
Play Games

Django中模板的用法簡介 1. 模板系統的介紹 Django作為一個Web框架,其模板所需的HTML輸出靜態部分以及動態內容插入 模板由HTML代碼和邏輯控制代碼構成 Django框架的模板語言的語法格式: {{var_name}} 例如:HTML被直接編碼在python代碼中: import ...


Django中模板的用法簡介

1. 模板系統的介紹

Django作為一個Web框架,其模板所需的HTML輸出靜態部分以及動態內容插入

模板由HTML代碼和邏輯控制代碼構成

Django框架的模板語言的語法格式:

{{var_name}}

例如:HTML被直接編碼在python代碼中:

import datetime
def current_datetie(request):
	time1 = datetime.datetime.now()
	html="<html><body>the time is $s.</body></html>"%time1
	
	return HttpResponse(html)

或者:

>>> python manange.py shell		#進入該django項目的環境
>>> from django.template import Context,Template
>>> t1=Template("hello {{name}}.")
>>> c1=Context({"name":"world"})
>>> t1.render(c1)
'hello world.'

同一個模板,可以有多個上下文,就可以通過創建模板對象來渲染多個上下文

創建一個模板就可以多次調用render()方法渲染上下文

2 模板支持的語法

語法格式:

{{var_name}}

Django模板解析工作都是在後臺通過對正則表達式一次性調用來完成

2.1 深度的變數查找

python manage.py shell  #進入Django項目環境終端

2.1.1 訪問列表索引

>>> from django.template import Template, Context
>>> t1 = Template('hello {{ items.2 }}.')
>>> c1 = Context({'items': ['linux', 'javascript', 'python']})
>>> t1.render(c1)
'hello python.'

2.1.2 訪問字典索引

>>> from django.template import Template,Context
>>> person = {"name":"Jack","age":22}
>>> t1 = Template("{{person.name}} is {{person.age}} years old.")
>>> c1 = Context({"person":person})
>>> t1.render(c1)
'Jack is 22 years old.'

2.1.3 datetime示例

>>> from django.template import Template,Context
>>> import datetime
>>> day1=datetime.datetime.utcnow()
>>> day1.year
2017
>>> day1.month
8
>>> day1.day
20
>>> t1=Template("the month is {{ date.month }} and the year is {{ date.year }}")
>>> c1=Context({"date":day1})
>>> t1.render(c1)
'the month is 8 and the year is 2017'

2.1.4 類的實例

>>> class Person(object):
...     def __init__(self,first_name,second_name):
...             self.first_name=first_name
...             self.second_name=second_name
...
>>> t1=Template("hello,{{ person.first_name }}--{{ person.second_name }}.")
>>> c1=Context({"person":Person("Jack","Bones")})
>>> t1.render(c1)
'hello,Jack--Bones.'	

2.1.5 引用對象方法

>>> from django.template import Template,Context
>>> t1 = Template("{{var}}--{{var.upper}}--{{var.isdigit}}")
>>> t1.render(Context({"var":"Hello"}))
'Hello--HELLO--False'
>>> t.render(Context({"var":"666"}))
'666--666--True'

註意點:

調用方法時並沒有使用圓括弧,而且也無法給該方法傳遞參數

2.2 變數的過濾器(filter的使用)

格式:

{{obj|filter:param}}

參數:

add                 給變數加上相應的值
addslashes          給變數中的引號前加上斜線
capfirst			首字母大寫
cut                 從字元串中移除指定的字元
date				格式化日期字元串
default             如果值是False,就替換成設置的預設值,否則就是用本來的值
default_if_none     如果值是None,就替換成設置的預設值,否則就使用本來的值

例子:

#value1="aBcDe"
{{ value1|upper }}#輸入為"ABCDE"

#value2=5
{{ value2|add:3 }}#輸入為8

#value3='he  llo wo r ld'
{{ value3|cut:' ' }}#輸入為"helloworld"

#value4="hello world"
{{ value4|capfirst }}#輸入為"Hello world"

#import datetime
#value5=datetime.datetime.now()
{{ value5|date:'Y-m-d' }}#輸入為"2017-08-20"

#value6=[]
{{ value6 }}#輸入為"[]"
{{ value6|default:'空的' }} #輸入為"空的"

#value7='<a href="#">click</a>'
{{ value7 }}#輸入為"<a href="#">click</a>"
{{ value7|safe }}<br> # 如果不想標簽被渲染,加safe即可
{{ value7|striptags }} 

{% autoescape off %}  #Django安全機制關閉,標簽會被渲染
  {{ value7 }}
{% endautoescape %}

#value8='1234'
{{ value8|filesizeformat }}
{{ value8|first }}
{{ value8|length }}
{{ value8|slice:":-1" }}

#value9='http://www.baidu.com/?a=1&b=3'
{{ value9|urlencode }}
value9='hello I am Tony'

標簽(tag)的使用(使用大括弧和百分比的組合來表示使用tag)

2.3 模板語言的控制語句

2.3.1 {% if %} 的使用

{% if %}標簽計算一個變數值,如果是“true”,即它存在、不為空並且不是falseboolean值,

系統則會顯示{% if %}{% endif %}間的所有內容

例子:

{% if num >= 100 and 8 %}
	{% if num > 200 %}
		<p>num大於200</p>
	{% else %}
		<p>num大於100小於200</p>
	{% endif %}
{% elif num < 100%}
	<p>num小於100</p>
{% else %}
	<p>num等於100</p>
{% endif %}

{% if %}標簽接受單個andor或者not來測試多個變數值或者否定一個給定的變數

{% if %}標簽不允許同一標簽里同時出現andor,否則會產生歧義

例如下麵的標簽是不合法的:

{% if obj1 and obj2 or obj3 %}  

2.3.2 {% for %}的使用

{% for %}標簽按順序遍歷一個序列中的各個元素,每次迴圈模板系統都會渲染{% for %}{% endfor %}之間的所有內容

例子:

<ul>
{% for obj in list %}
	<li>{{ obj }}</li>
{% endfor %}
</ul>

可以在標簽里添加reversed來反序迴圈列表:

{% for obj in list reversed %}
...
{% endfor %}

{% for %}標簽可以嵌套:

{% for country in countries %}
	<h1>{{ country.name }}</h1>
	<ul>
	 {% for city in country.city_list %}
		<li>{{ city }}</li>
	 {% endfor %}
	</ul>
{% endfor %}

for迴圈不支持中斷迴圈,也不支持continue語句

{% for %}標簽內置了一個forloop模板變數,這個變數含有關於迴圈的屬性

forloop.counter         表示迴圈的次數,它從1開始計數
forloop.counter0        類似於forloop.counter,但它是從0開始計數
forloop.revcounter      反向遍歷整個列表,revcounter表示迴圈的次數,最後一次為1
forloop.revcounter0     反向遍歷整個列表,revcounter表示迴圈的次數,最後一次為0
forloop.first           返回一個布爾值,當第一次迴圈時值為True,其餘為False	

例子:

{% for item in todo_list %}
	<p>{{ forloop.counter }}: {{ item }}</p>
{% endfor %}

{% for object in objects %}   
	 {% if forloop.first %}
	 	<li class="first">
	 {% else %}
	 	<li>
	 {% endif %}   
	 	{{ object }}</li>  
{% endfor %} 

forloop變數只能在迴圈中得到,當模板解析器到達{% endfor %}forloop變數就會消失

如果模板context已經包含一個叫forloop的變數,Django會用{% for %}標簽替代它

Django會在for標簽的塊中覆蓋由開發人員定義的forloop變數的值

在其他非迴圈的地方,你的forloop變數仍然可用

2.3.3 {% empty %}

用法:

{{li }}
	  {%  for i in li %}
		  <li>{{ forloop.counter0 }}----{{ i }}</li>
	  {% empty %}
		  <li>this is empty!</li>
	  {% endfor %}

2.3.4 {% csrf_token %} csrf_token標簽

用於生成csrf_token的標簽,用於防治跨站攻擊驗證

如果viewindex里用的是render_to_response方法,則不會生效

其實這裡是生成一個input標簽,與其他表單標簽一起提交給後臺的

2.3.5 {% url %} #引用路由配置的地址

2.3.6 {% verbatim %} #禁止render

用法:

{% verbatim %}	#hello標簽不會被模板渲染
	{{ hello }}
{% endverbatim %}

2.3.7 {% load %} 載入標簽庫

2.3.8 自定義filter和simply_tag

1、在app中創建templatetags模塊

2、創建任意 .py 文件,如:my_tags.py

from django import template
from django.utils.safestring import mark_safe

register = template.Library()  # register的名字是固定的,不可改變

@register.filter
def custom_filter(x,y):
	return x*y

@register.simple_tag
def custom_simple(x,y,z):
	return x+y+z

3、在使用自定義simple_tag和filter的html文件中導入之前創建的 my_tags.py :{% load my_tags %}

4、使用simple_tag和filter

-------------------------------HTML文件
{% load xxx %}         # 位於首行,xxx代表自定義的文件名
<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<title>Title</title>
</head>
<body>
	<h1>Hello {{ user.0 }}</h1>
	
	{{ user.3|custom_filter:8 }}

	{% custom_simple user.3 2 3 %}
</body>
</html>

5、在settings中的INSTALLED_APPS配置當前app,不然django無法找到自定義的simple_tag

6、filter可以用在if等語句後,simple_tag不可以

{% if num|filter_multi:30 > 100 %}
	{{ num|filter_multi:30 }}
{% endif %}

2.4 模板繼承

2.4.1 include(繼承)模板標簽

{% include %}是一個內建模板標簽,允許在模板中包含其它的模板內容.

標簽的參數是所要包含的模板的名稱,可以是一個變數,也可以是單/雙引號硬編碼的字元串.

每當在多個模板中出現相同的代碼時,就應該考慮是否要使用{% include %}來減少代碼重覆

2.4.2 extend(繼承)模板標簽

在一個大型網站中,有一些區域的內容始終是不變的,

減少共用頁面區域所引起的重覆和冗餘代碼Django框架中使用的方法就是模板繼承

本質上來說,模板繼承是先構造一個基礎框架模板,而後在其子模板中對公用部分和定義塊進行重載

母板:{% block title %}{% endblock %}    # 定義盒子
子板:{% extends "base.html" %}          # 繼承母板的內容,且必須放在模板第一行
   {% block title %}{% endblock %}    # 可以對盒子的內容進行修改
	  {% csrf_token %}                   # 取消csrf安全保護
   {% black.super %}
	 {% include '小組件路徑' %}           # HTML出現相同塊代碼時,新建公用小組件HTML文件

如果在模板中使用{% extends %},必須保證其為模板中的第一個模板標記,否則模板不會起作用

一般來說,基礎模板中的{% block %}標簽越多越好,子模板不必定義父模板中所有的代碼塊,
因此,可以用合理的預設值對一些代碼塊進行填充,然後只對子模板所需的代碼塊進行重定義.

如果多個模板之間的代碼重用太多,可以考慮將重覆代碼段放放到父模板的某個{% block %}中.

當需要訪問父模板中的塊的內容,使用{{ block.super }}標簽,這個魔法變數將會表現出父模板中的內容,

如果只想在上級代碼塊基礎上添加內容,而不是全部重載,這個魔法變數就非常有用了.

不允許在同一個模板中定義多個同名的{% block %}.

因為block標簽的工作方式是雙向的,block標簽定義了在父模板中{% block %}.

如果父模板中出現了兩個相同名稱的{% block %}標簽,父模板將無法使用哪個塊的內容


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

-Advertisement-
Play Games
更多相關文章
  • 前言 本文旨在理一下vue中diff演算法的主要邏輯和關鍵細節。 從一個簡單的demo切入: p標簽渲染一個items數組 <div id="demo"> <p v-for="item in items" :key="item">{{ item }}</p> </div> <script src=". ...
  • 前言 有一個問題, 給定一個物體的運動軌跡, 包含時間和坐標的數組, 如何使用這個數據來預測物體未來的運動走勢?? 本文提供了一個很簡單的方式去實現這個演算法. 效果夠用, 又簡單, 有一定的準確程度. 緣由 以前做過的一些手機應用, 沒有做動畫的 , 也沒做手勢. 這個做起來挺麻煩的. 最近開始了新 ...
  • 雖然Vue 3還沒有正式發佈,但是熱愛新技術的我早已按捺不住自己的內心,開始嘗試在小項目中使用它了。 1.根據這篇《今日凌晨Vue3 beta版震撼發佈,竟然公開支持腳手架項目!》我搭建了一個Vue 3的腳手架項目,用這種方式搭建的腳手架項目不僅僅只有vue是新版的,就連vue-router、vue ...
  • 1.1什麼是數據結構? 官方解釋: 數據結構是一門研究非數值計算的程式設計問題中的操作對象,以及他們之間的關係和操作等相關問題的學科。 大白話 : 數據結構就是把數據元素按照一定的關係組織起來的集合,用來組織和存儲數據 1.2數據結構分類? 傳統上。我們可以把數據結構分為邏輯結構和物理結構兩大類。 ...
  • 1.前言 這應該是本學期最後一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得瞭如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業過程總結 相比前兩個單元,此單 ...
  • 特別註意:本代碼為 Springboot 工作流 前後分離 + 跨域 版本 (許可權控制到菜單和按鈕) 後臺框架:springboot2.3.0+ Flowable6.5.0+ mybaits+maven+介面 前端頁面:html +vue.js 形式 jquery ajax 非同步跨域 json 格式 ...
  • 對MVC、MVP、MVVM的理解(一) 一、MVC MVC模式再網上的爭議是最大的,一些博客中是這樣描述的 MVC模式的通信是單向的,View觸發事件或數據的提交,到了Controller進行處理邏輯之後,返回Model給View,View再從Model中取出數據,當然View中也會有相應的邏輯。個 ...
  • 一、雜論 1.電腦的存儲方式可以分為兩大基本類型:整數類型和浮點類型。 2.C語言中的數據類型關鍵字: int\long\short\unsigned\char\float\double\signed\void\__Bool\__Complex\__Imaginary 3. 1位元組(byte) = ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...