模板层(模板语法)
模板層
標簽
過濾器
自定義標簽 過濾器 inclusion_tag
模板的繼承
模板的導入
#后期向前端頁面傳遞數據的方式 #第一種 return render(request,'index.html',{'n':n}) #第二種 return render(request,'index.html',locals()) #將當前所在的名稱空間中的名字全部傳遞給前端頁面?
模板層中支持的寫法
{# 取l中的第一個參數 #} {{ l.0 }} {# 取字典中key的值 #} {{ d.name }} {# 取對象的name屬性 #} {{ person_list.0.name }} {# .操作只能調用不帶參數的方法 #} {{ person_list.0.dream }}只需要記兩種特殊符號:
{{? }}和?{% %}
變量相關的用{{}},邏輯相關的用{%%}
?
?
后端
from django.shortcuts import render# Create your views here.def index(request):n=6969s='你好 技術類的 束帶結發了 jsddsfjl sdjfl1'# l = ['a', 'b', 'c','d','e','f','g']l = []d = {'name':'jason','password':'22','hobby':['看書','學習','琴棋書畫']}t = ('觀摩','邪魔','容嬤嬤')st ={'python','java','php','golang'}# flag = 123flag = Nonedef func():return '你找我干啥?'class Demo(object):def __init__(self,name):self.name = namedef func(self):return self.name@classmethoddef index(cls):return 'cls'@staticmethoddef bar(name,age):return 'bar'def __str__(self):return '大帥比'obj = Demo('jason')print(obj) #<app01.views.index.<locals>.Demo object at 0x00000000042F7908> file_size = 231334from datetime import datetimectime = datetime.now()res = 'hello big ba by baj na jam lj'ht = '<h1>我是h1標簽</h1>'sr = '<script>alert(123)</script>'from django.utils.safestring import mark_safexxx = mark_safe('<h1>我是安全的h1</h1>')return render(request,'index.html',locals()) #將當前所在的名稱空間中的名字全部傳遞給前端頁面?
前端
<p>{{ n }}</p> <p>{{ s }}</p><p>{{ d }}</p> <p>{{ d.hobby.2 }}</p> <p>{{ t }}</p> <p>{{ t.2 }}</p> <p>{{ st }}</p> <!--集合無序--> <p>{{ flag }}</p> <p>{{ func }}</p> <!--無參函數 會自動加括號調用 --><p>{{ obj }}</p> <!--<app01.views.index.<locals>.Demo object at 0x0000000004309E10>--> <p>{{ obj.name }}</p> <p>{{ obj.func }}</p> <p>{{ obj.bar }}</p> <!--不支持傳參--> <p>{{ obj.index }}</p> <!--類方法綁定給類 不需要手動傳入參數-->{#過濾器#} {#調用python自帶的內置方法,可以調用不需要傳參的一些內置方法#} <!--我是原生的html注釋--> #這里的注釋可以在前端頁面檢查看到 <p>前端統計字符串長度{{ s|length }}</p> {#前端統計字符串長度30#}<p>前端獲取數據如果是空就返回default后面默認的數值》》》》{{ flag|default:'flag沒有值' }}</p> {#前端獲取數據如果是空就返回default后面默認的數值》》》》flag沒有值#}<p>把數字按照數據轉換進制進行轉換表示文件大小的單位:{{ file_size|filesizeformat }}</p> {#把數字按照 數據轉換進制 進行轉換表示文件大小的單位:225.9 KB#} <p>{{ ctime }}</p> {#June 11, 2019, 3:15 p.m.#}<p>格式化時間(不要加百分號){{ ctime|date:'Y-m-d' }}</p> {#格式化時間(不要加百分號)2019-06-11#} <p>字符串的切片操作:{{ res|slice:'0:8' }}</p> {#hello bi#}<p>{{ res|slice:'0:8:2' }}</p> {#hlob#} <p>截取固定的長度的字符串 四個點也算:{{ s|truncatechars:10 }}</p> {#截取固定的長度的字符串 三個點也算:你好 技術類...#}<p>按照空格截取文本內容:{{ res|truncatewords:4 }}</p> {#按照空格截取文本內容:hello big ba by ...#}<p>{{ s|truncatewords:4 }}</p> {#你好 技術類的 束帶結發了 jsddsfjl ...#}<p>{{ 'hhha'|add:'hehheheh' }}</p> {#hhhahehheheh#}{#重點#}
<p>{{ ht }}</p>
{#<h1>我是h1標簽</h1>#}
<p>{{ sr }}</p>
{#<script>alert(123)</script>#}
<p>{{ ht|safe }}</p>
{#前端可以識別#}
<p>{{ sr|safe }}</p>
{#告訴前端是安全的前端可以識別腳本語法#}
<p>{{ xxx }}</p>
{#后端處理好已經是安全的再去發給前端#}
{#標簽#}
{% for foo in l %}
{# <p>{{ foo }}</p>#}
{# <p>{{ forloop.counter }}</p>#} for循環次數從1 開始計數
{# <p>{{ forloop.counter0 }}</p>#} for循環次數從0開始計數
{% if forloop.first %}
<p>這是第一次</p>
{% elif forloop.last %}
<p>這是最后一次</p>
{% else %}
<p>{{ foo }}</p>
{% endif %}
{% empty %}
<p>你給我的容器是個空的啊!這怎么玩?</p>
{% endfor %}
{% if flag %}
<p>flag不為空</p>
{% else %}
<p>flag竟然是空的 臥槽</p>
{% endif %}
{% for foo in d.keys %}
<p>{{ foo }}</p>
{% endfor %}
{% for foo in d.values %}
<p>{{ foo }}</p>
{% endfor %}
{% for foo in d.items %}
<p>{{ foo }}</p>
{% endfor %}
{{ d.keys }}
{{ d.values }}
{{ d.items }}
{{ d.hobby.2 }}
{% with d.hobby.2 as h %} #這個是當你這個值用到的很多次的時候可以起別名 但是這個別名只能在with里面使用 原來的方式點語法依然可以使用
{{ h }}
{{ d.hobby.2 }}
{% endwith %} ?總結: 后端傳函數名到前端,會自動加括號調用,但是不支持傳參
后端傳對象到前端,就相當于打印了這個對象
前端獲取后端傳過來的容器類型的內部元素,統一采用句點符號(.)
<p>{{ d.hobby.2 }}</p> 數字對應的就是數據的索引
前端能夠調用python后端數據類型的一些不需要傳參的內置方法
模板語法的注意:
不會展示到前端的頁面:{#調用python自帶的內置方法,可以調用不需要傳參的一些內置方法#}
原生html的注釋
會展示到前端:<!--我是原生的html注釋-->
?
?前后端取消轉義(*****) 腳本語法 js語法 都能識別
#前端|safe#后端 from django.utils.safestring import mark_safe xxx= mark_safe('<h1>我是h1標簽</h1>')?
?標簽
for循環{%for foo in l %}<P>{{ foo }}</P><p>{{ forloop }}</p>{% endfor %} if 判斷{% if flag %}<p>flag不為空</p>{% else %}<p>flag是空</p>{% endif %}嵌套使用{% for foo in l %}{% if forloop.first %}<p>這是我的第一次</p>{% elif forloop.last %}<p>這是最后一次了啊</p>{% else %}<p>嗨起來!!!</p>{% endif %}{% endfor %}empty當你的for循環對象為空的時候會自動走empty代碼塊的內容后端:l = None前端:{% for foo in l %}{% if forloop.first %}<p>這是我的第一次</p>{% elif forloop.last %}<p>這是最后一次了啊</p>{% else %}<p>嗨起來!!!</p>{% endif %}{% empty %}<p>你給我的容器類型是個空啊,沒法for循環</p>{% endfor %}?filters過濾器
在Django的模板語言中,通過使用?過濾器?來改變變量的顯示。
過濾器的語法: {{ value|filter_name:參數 }}
使用管道符"|"來應用過濾器。
例如:{{ name|lower }}會將name變量應用lower過濾器之后再顯示它的值。lower在這里的作用是將文本全都變成小寫。
注意事項:
?
Django的模板語言中提供了大約六十個內置過濾器。
default
如果一個變量是false或者為空,使用給定的默認值。 否則,使用變量的值。
{{ 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"}}?可用的參數:
| a | 'a.m.'或'p.m.'(請注意,這與PHP的輸出略有不同,因為這包括符合Associated Press風格的期間) | 'a.m.' |
| A | 'AM'或'PM'。 | 'AM' |
| b | 月,文字,3個字母,小寫。 | 'jan' |
| B | 未實現。 | ? |
| c | ISO 8601格式。?(注意:與其他格式化程序不同,例如“Z”,“O”或“r”,如果值為naive datetime,則“c”格式化程序不會添加時區偏移量(請參閱datetime.tzinfo) 。 | 2008-01-02T10:30:00.000123+02:00或2008-01-02T10:30:00.000123如果datetime是天真的 |
| d | 月的日子,帶前導零的2位數字。 | '01'到'31' |
| D | 一周中的文字,3個字母。 | “星期五” |
| e | 時區名稱?可能是任何格式,或者可能返回一個空字符串,具體取決于datetime。 | ''、'GMT'、'-500'、'US/Eastern'等 |
| E | 月份,特定地區的替代表示通常用于長日期表示。 | 'listopada'(對于波蘭語區域,而不是'Listopad') |
| f | 時間,在12小時的小時和分鐘內,如果它們為零,則分鐘停留。?專有擴展。 | '1','1:30' |
| F | 月,文,長。 | '一月' |
| g | 小時,12小時格式,無前導零。 | '1'到'12' |
| G | 小時,24小時格式,無前導零。 | '0'到'23' |
| h | 小時,12小時格式。 | '01'到'12' |
| H | 小時,24小時格式。 | '00'到'23' |
| i | 分鐘。 | '00'到'59' |
| I | 夏令時間,無論是否生效。 | '1'或'0' |
| j | 沒有前導零的月份的日子。 | '1'到'31' |
| l | 星期幾,文字長。 | '星期五' |
| L | 布爾值是否是一個閏年。 | True或False |
| m | 月,2位數字帶前導零。 | '01'到'12' |
| M | 月,文字,3個字母。 | “揚” |
| n | 月無前導零。 | '1'到'12' |
| N | 美聯社風格的月份縮寫。?專有擴展。 | 'Jan.','Feb.','March','May' |
| o | ISO-8601周編號,對應于使用閏年的ISO-8601周數(W)。對于更常見的年份格式,請參見Y。 | '1999年' |
| O | 與格林威治時間的差異在幾小時內。 | '+0200' |
| P | 時間為12小時,分鐘和'a.m。'/'p.m。',如果為零,分鐘停留,特殊情況下的字符串“午夜”和“中午”。?專有擴展。 | '1?am','1:30?pm'?/ t3>,'midnight','noon','12:30pm'?/ T10> |
| r | RFC 5322格式化日期。 | 'Thu,?21?Dec?2000?16:01:07?+0200' |
| s | 秒,帶前導零的2位數字。 | '00'到'59' |
| S | 一個月的英文序數后綴,2個字符。 | 'st','nd','rd'或'th' |
| t | 給定月份的天數。 | 28?to?31 |
| T | 本機的時區。 | 'EST','MDT' |
| u | 微秒。 | 000000?to?999999 |
| U | 自Unix Epoch以來的二分之一(1970年1月1日00:00:00 UTC)。 | ? |
| w | 星期幾,數字無前導零。 | '0'(星期日)至'6'(星期六) |
| W | ISO-8601周數,周數從星期一開始。 | 1,53 |
| y | 年份,2位數字。 | '99' |
| Y | 年,4位數。 | '1999年' |
| z | 一年中的日子 | 0到365 |
| Z | 時區偏移量,單位為秒。?UTC以西時區的偏移量總是為負數,對于UTC以東時,它們總是為正。 | -43200到43200 |
?
safe
Django的模板中會對HTML標簽和JS等語法標簽進行自動轉義,原因顯而易見,這樣是為了安全。但是有的時候我們可能不希望這些HTML元素被轉義,比如我們做一個內容管理系統,后臺添加的文章中是經過修飾的,這些修飾可能是通過一個類似于FCKeditor編輯加注了HTML修飾符的文本,如果自動轉義的話顯示的就是保護HTML標簽的源文件。為了在Django中關閉HTML的自動轉義有兩種方式,如果是一個單獨的變量我們可以通過過濾器“|safe”的方式告訴Django這段代碼是安全的不必轉義。
比如:
value = "<a href='#'>點我</a>"
{{ value|safe}}truncatechars
如果字符串字符多于指定的字符數量,那么會被截斷。截斷的字符串將以可翻譯的省略號序列(“...”)結尾。
參數:截斷的字符數
{{ value|truncatechars:9}}truncatewords
在一定數量的字后截斷字符串。 按照空格切分
{{ value|truncatewords:9}}cut
移除value中所有的與給出的變量相同的字符串
{{ value|cut:' ' }}如果value為'i love you',那么將輸出'iloveyou'.
join
使用字符串連接列表,例如Python的str.join(list)
timesince
將日期格式設為自該日期起的時間(例如,“4天,6小時”)。
采用一個可選參數,它是一個包含用作比較點的日期的變量(不帶參數,比較點為現在)。 例如,如果blog_date是表示2006年6月1日午夜的日期實例,并且comment_date是2006年6月1日08:00的日期實例,則以下將返回“8小時”:
{{ blog_date|timesince:comment_date }}分鐘是所使用的最小單位,對于相對于比較點的未來的任何日期,將返回“0分鐘”。
timeuntil
似于timesince,除了它測量從現在開始直到給定日期或日期時間的時間。 例如,如果今天是2006年6月1日,而conference_date是保留2006年6月29日的日期實例,則{{ conference_date | timeuntil }}將返回“4周”。
使用可選參數,它是一個包含用作比較點的日期(而不是現在)的變量。 如果from_date包含2006年6月22日,則以下內容將返回“1周”:
{{ conference_date|timeuntil:from_date }}?
?
?
自定義過濾器必須做的三件事:
#1 在應用名下新建一個名為tmplatetags文件夾(必須叫這個名字) #2 在該新建的文件夾內新建一個任意名稱的py文件 #3 在該py文件中需要固定寫下面兩句代碼from django import template register = template.Library()#自定過濾器 @register.filter(name='XBB') def index(a,b):return a+b #自定義標簽 @register.simple_tag def plus(a,b,c):return a+b+c#自定義inclusion_tag @register.inclusion_tag('login.html',name='login') def login(n):l = ['第%s項'%i for i in range(n)]return {'l':l}#login.html <ul>{% for foo in l %}<li>{{ foo}} </li>{% endfor %} </ul> #調用 #是將自定義的inclusion_tag 返回給它的括號內指定的小頁面 在頁面渲染好之后 是把這個渲染好的頁面返回給調用頁面的地方 {% login 5 %}#注意:要想使用自定義的過濾器 標簽 inclusion_tag 必須現在需要使用的html頁面加載你的py文件
{% load my_tag%} #這個my_tag就是你tmplatetags文件夾下的py文件
{{ 666|XBB:8}} #過濾器
{% plus 1 2 3 %} #標簽
{% login 5 %} #inclusion_tag
?
for循環
普通for循環
<ul> {% for user in user_list %}<li>{{ user.name }}</li> {% endfor %} </ul>for循環可用的一些參數:
?
| 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判斷
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 里面用 原始的變量依然可以使用
注意等號左右不要加空格。
{% with total=business.employees.count %}{{ total }} employee{{ total|pluralize }} {% endwith %}或
{% with business.employees.count as total %}{{ 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的值。
?
模板的繼承與導入
#首先需要再被繼承的模塊中劃分多個區域 {% block 給區域起的名字 %}{% endblock %}#通常情況下一個模板中應該至少有三塊 {% block css %} 頁面css代碼塊 {% endblock %}{% block js %} 頁面js代碼塊 {% endblock %}{% block contet %} #注意起的名字不加引號頁面主題內容 {% endblock %}?
子板繼承模板
#先繼承模板所有的內容 {% extends 'home.html' %}#然后根據block塊的名字修改指定區域的內容 {% block content %}<form action=""><p>username:<input type="text" class="form-control"></p><p>password:<input type="text" class="form-control"></p></form> {% endblock %}?
模板的導入:將一段html當做模塊的方式導入另一個html展示
{% include '想導入的html文件名' %}?
靜態文件相關
?
{% static %}
{% 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!" />?
?
靜態文件配置
{% load static %} <link rel='stylesheet' href="{% static 'css/mycss.css'%}"> # 第一種方式<link rel='stylesheet' href="{% get_static_prefix %}css/mycss.css"> # 第二種方式?
轉載于:https://www.cnblogs.com/lakei/p/11006285.html
總結
- 上一篇: 当初阿里巴巴、百度、美团都差点错过的架构
- 下一篇: man(2) V