模板層
模板烤宙,其實(shí)就是一個(gè)HTML頁面,我們只不過是婿崭,通過一些標(biāo)簽對(duì)其進(jìn)行數(shù)據(jù)的渲染最終展示給用戶的內(nèi)容拨拓。而對(duì)于模板層,我們主要的精力不在HTML上氓栈,而是在標(biāo)簽上
變量
視圖傳遞給模板的數(shù)據(jù)渣磷,可以是一個(gè)數(shù)據(jù),也可以是一個(gè)對(duì)象
def start(request):
title = "歡迎學(xué)習(xí)django"
lists = [1, 2, 3]
return render(request, 'userInfo\\add_user.html', {'title': title, 'list': lists})
遵守標(biāo)識(shí)符規(guī)則
語法:{{var}} -> {{num}}
注意:如果使用的變量不存在授瘦,則插入的是空字符串醋界。
在模板中使用 . 語法
{{stu.name}}: 使用.語法,要是字典類型提完,或者是對(duì)象中的屬性或者方法
在模板中調(diào)用方法:{{stu.getName}}
注意形纺,在模板中調(diào)用方法,不能傳遞參數(shù)徒欣。
標(biāo)簽
語法:{% tag %}
if標(biāo)簽:邏輯判斷語句
在輸出中用判斷一些關(guān)系逐样,來決定數(shù)據(jù)的不同處理方式
格式:
{%if 表達(dá)式 %}
語句1
{% elif 表達(dá)式 %}
語句2
{% else %}
語句3
{% endif %}
for 標(biāo)簽:循環(huán)語句
循環(huán)語句就是將字典或者是列表中的數(shù)據(jù)一條一條的迭代出來。
格式:
{% for 變量 in 列表 %}
語句1
{% empty %}
語句2
{% endfor %}
注意 : 列表為空或者是列表不存在的時(shí)候打肝,執(zhí)行語句2
{{ forloop.counter}}:表示循環(huán)的第幾次
例:
<ul>
{% for stu in students %}
<li>{{forloop.counter}}---{{stu.sname}}---{{stu.sgrade}}</li>
{% empty %}
<li>目前沒有學(xué)生</li>
{% endfor %}
</ul>
comment標(biāo)簽
多行注釋
格式:
{% comment %}
這里是注釋的內(nèi)容脂新,
不會(huì)顯示在頁面中,
而且可以是多行粗梭。
{% endcomment %}
ifequal/ifnotequal
判斷是否相等或者不相等
格式:
{% ifequal 值1 值2 %}
語句
{% endifequal %}
{% ifnotequal 值1 值2 %}
語句1
{% endifequal %}
如果值1 和值2相等戏羽,執(zhí)行語句
如果值1和值2不相等,執(zhí)行語句1
include 標(biāo)簽
加載模板并以標(biāo)簽內(nèi)的參數(shù)渲染
格式:
{% include '模板目錄' 參數(shù)1 參數(shù)2 %}
url 標(biāo)簽
url標(biāo)簽是用來做動(dòng)態(tài)url的楼吃,需要配置工程配置目錄中的url中定義的namaspace以及namespace中配置的app中的url中所對(duì)應(yīng)的name來進(jìn)行合成url,后邊的參數(shù) p1 p2 是在URL中的參數(shù)妄讯,如果有多個(gè)孩锡,就依次用空格分開,沒有就不需要寫亥贸。
格式:
{% url 'namespace:name' p1 p2 %}
csrf_token 標(biāo)簽
用于跨站請(qǐng)求偽造保護(hù)的
格式:
{% csrf_token %}
此處的標(biāo)簽很簡單躬窜,就是將原木原樣的標(biāo)簽放入到for表單中的任意位置即可。
block/extends標(biāo)簽
用于模板的繼承
autoescape 標(biāo)簽
作用于HTML轉(zhuǎn)義
過濾器
在變量顯示前修改它 語法{{var | 過濾器 }}
假設(shè)我在視圖中返回一個(gè)字符串炕置,都是小寫字母荣挨。
def test(request):
return render(request, 'pages\test.html', {'str': 'sbc'})
r我在HTML文件中獲取文件時(shí)只需要使用{{str}}即可將變量的值取出來男韧。如果使用過濾器,取值方式如下:
<h1>{{str|upper}}</h1>
常用過濾器:power/upper/default/date/join
過濾器可以傳遞參數(shù)默垄,參數(shù)用引號(hào)引起來.
join:格式:列表|join:’#’
示例:
<h1>{{list|join:’,’}}</h1>
如果一個(gè)變量沒有被提供此虑,或者值為false、空,可以使用默認(rèn)值
格式:{{var|default:’沒有’}}
根據(jù)給定格式轉(zhuǎn)換日期為字符串
Date:格式:{{dateVal|date:’y-m-d’}}
HTML轉(zhuǎn)義:escape
加減乘除:
<h2>{{num|add:-10}}</h2><h2>{% widthratio num 1 5 %}</h2># (num/1)*5
奇偶行換色
<ul>
{% for stu in students %}
{% if forloop.counter | divisibleby:2 %}
<li style='color:red'>{{forloop.counter}}---{{stu.sname}}---{{stu.sgrade}}</li>
{% else %}
<li style='color:blue'>{{forloop.counter}}---{{stu.sname}}---{{stu.sgrade}}</li>
{% endif %}
{% empty %}
<li>目前沒有學(xué)生</li>
{% endfor %}
</ul>
注釋
單行注釋
{# 注釋的內(nèi)容 }
多行注釋
{% comment %}
dfg
dfggh
gh
{% endcomment %}
反向解析
鏈接 此時(shí)如果url正則變了口锭,那么所有的鏈接就都要修改朦前。使用反向解析可以解決這個(gè)問題 Project下的urls
url(r’^’, include(‘a(chǎn)pp.urls’, namespace=’something’))
app下的urls文件
url(r’^good/$’,views.good. name=’good’)
頁面鏈接
<a href=’{% url ‘something:good’%}’>
此時(shí),無論怎么修改url正則鹃操,都不會(huì)影響頁面中的任何url
模板繼承
作用:模板繼承可以減少頁面的內(nèi)容的重復(fù)定義韭寸,實(shí)現(xiàn)頁面的重用 Block標(biāo)簽:在父模板中預(yù)留區(qū)域,子模板去填充
語法:{% block 標(biāo)簽名 %}{% endblock 標(biāo)簽名%}
一個(gè)模板中可以定義多個(gè)block塊
Extends標(biāo)簽:繼承模板荆隘,需要寫在模板文件的第一行
語法:{% extends ‘父模板路徑’ %}
示例:
定義父模板: base.html:
<body>
<div id = ‘header’></div>
<div id=‘main’>
{% block main %}
{% endblock main%}
</div>
<div id= ‘footer’></div>
</body>
定義子模板: index.html:
{% extends ‘base.html’%}
{% block main%}
<h2>you are the best!!!</h2>
{% block main%}
HTML轉(zhuǎn)義
后臺(tái)傳過來的HTML代碼字符串恩伺,如果不轉(zhuǎn)義,他就會(huì)當(dāng)成普通字符串渲染椰拒。
將接收到的HTML字符串解析成HTML進(jìn)行渲染 {{code}} {{code|escape}} {{code|safe}} {% autoescape off %} {{code}} {% endautoescape %}
csrf跨站請(qǐng)求偽造
某些惡意網(wǎng)站包含鏈接晶渠、表單、按鈕耸三、js乱陡,利用登錄用戶在瀏覽器中認(rèn)證從而攻擊服務(wù)。 防止CSRF: 在settings.py文件中的中間件配置增加csrf的配置仪壮,默認(rèn)配置好了憨颠。但是加完了,自己也登錄不了了积锅。 我們自己訪問爽彤,需要在我們的表單中添加{% csrf_token %}
驗(yàn)證碼
def verifycode(request):
# 引入繪圖模塊
from PIL import Image, ImageDraw, ImageFont
# 引入隨機(jī)函數(shù)模塊
import random
# 定義變量,用于畫面的背景色缚陷、寬适篙、高
bgcolor = (random.randrange(20, 100), random.randrange(20, 100), random.randrange(20, 100)) width = 100 height = 50
# 創(chuàng)建畫面對(duì)象
im = Image.new('RGB',(width, height),bgcolor)
# 創(chuàng)建畫筆對(duì)象
draw = ImageDraw.Draw(im)
# 調(diào)用畫筆的point()函數(shù)繪制噪點(diǎn)
for i in range(0, 100):
xy = (random.randrange(0, width), random,randrange(0, height))
fill = (random.randrange(0, 255), 255, random.randrange(0, 255))
draw.point(xy, fill=fill)
# 定義驗(yàn)證碼的備選值
str = '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM'
# 隨機(jī)選取四個(gè)值作為驗(yàn)證碼
rand_str = ''
for i in range(0,4):
rand_str += str[random.randrange(0, len(str))]
# 構(gòu)建字體對(duì)象
font = ImageFont.truetype(r'C\Windows\Fonts\AdobeArabic-Bold.otf', 40)
# 構(gòu)建字體顏色
fontcolor1 =(255, random.randrange(0, 255), random.randrange(0, 255))
fontcolor2 =(255, random.randrange(0, 255), random.randrange(0, 255))
fontcolor3 =(255, random.randrange(0, 255), random.randrange(0, 255))
fontcolor4 =(255, random.randrange(0, 255), random.randrange(0, 255))
# 繪制四個(gè)字
draw.text((5, 2), rand_str[0], font=font, fill=fontcolor1)
draw.text((25, 2), rand_str[1], font=font, fill=fontcolor2)
draw.text((50, 2), rand_str[2], font=font, fill=fontcolor3)
draw.text((75, 2), rand_str[3], font=font, fill=fontcolor4)
# 釋放畫筆
del draw
# 存入session , 用于做進(jìn)一步驗(yàn)證
request.session['verifycode'] = rand_str
# 內(nèi)存文件操作
import io buf = io.BytesIO()
# 將圖片保存在內(nèi)存中,文件類型為png
im.safe(buf, 'png')
# 將內(nèi)存中的圖片數(shù)據(jù)返回給客戶端箫爷,MIME類型為圖片png
return HttpResponse(buf.getValue(), 'image/png')