模板層
模板,其實就是一個HTML頁面,我們只不過是,通過一些標簽對其進行數(shù)據(jù)的渲染最終展示給用戶的內(nèi)容。而對于模板層,我們主要的精力不在HTML上,而是在標簽上
變量
視圖傳遞給模板的數(shù)據(jù),可以是一個數(shù)據(jù),也可以是一個對象
def start(request):
title = "歡迎學習django"
lists = [1, 2, 3]
return render(request, 'userInfo\\add_user.html', {'title': title, 'list': lists})
遵守標識符規(guī)則
語法:{{var}} -> {{num}}
注意:如果使用的變量不存在,則插入的是空字符串。
在模板中使用 . 語法
{{stu.name}}: 使用.語法,要是字典類型,或者是對象中的屬性或者方法
在模板中調(diào)用方法:{{stu.getName}}
注意,在模板中調(diào)用方法,不能傳遞參數(shù)。
標簽
語法:{% tag %}
if標簽:邏輯判斷語句
在輸出中用判斷一些關系,來決定數(shù)據(jù)的不同處理方式
格式:
{%if 表達式 %}
語句1
{% elif 表達式 %}
語句2
{% else %}
語句3
{% endif %}
for 標簽:循環(huán)語句
循環(huán)語句就是將字典或者是列表中的數(shù)據(jù)一條一條的迭代出來。
格式:
{% for 變量 in 列表 %}
語句1
{% empty %}
語句2
{% endfor %}
注意 : 列表為空或者是列表不存在的時候,執(zhí)行語句2
{{ forloop.counter}}:表示循環(huán)的第幾次
例:
<ul>
{% for stu in students %}
<li>{{forloop.counter}}---{{stu.sname}}---{{stu.sgrade}}</li>
{% empty %}
<li>目前沒有學生</li>
{% endfor %}
</ul>
comment標簽
多行注釋
格式:
{% comment %}
這里是注釋的內(nèi)容,
不會顯示在頁面中,
而且可以是多行。
{% endcomment %}
ifequal/ifnotequal
判斷是否相等或者不相等
格式:
{% ifequal 值1 值2 %}
語句
{% endifequal %}
{% ifnotequal 值1 值2 %}
語句1
{% endifequal %}
如果值1 和值2相等,執(zhí)行語句
如果值1和值2不相等,執(zhí)行語句1
include 標簽
加載模板并以標簽內(nèi)的參數(shù)渲染
格式:
{% include '模板目錄' 參數(shù)1 參數(shù)2 %}
url 標簽
url標簽是用來做動態(tài)url的,需要配置工程配置目錄中的url中定義的namaspace以及namespace中配置的app中的url中所對應的name來進行合成url,后邊的參數(shù) p1 p2 是在URL中的參數(shù),如果有多個,就依次用空格分開,沒有就不需要寫。
格式:
{% url 'namespace:name' p1 p2 %}
csrf_token 標簽
用于跨站請求偽造保護的
格式:
{% csrf_token %}
此處的標簽很簡單,就是將原木原樣的標簽放入到for表單中的任意位置即可。
block/extends標簽
用于模板的繼承
autoescape 標簽
作用于HTML轉義
過濾器
在變量顯示前修改它 語法{{var | 過濾器 }}
假設我在視圖中返回一個字符串,都是小寫字母。
def test(request):
return render(request, 'pages\test.html', {'str': 'sbc'})
r我在HTML文件中獲取文件時只需要使用{{str}}即可將變量的值取出來。如果使用過濾器,取值方式如下:
<h1>{{str|upper}}</h1>
常用過濾器:power/upper/default/date/join
過濾器可以傳遞參數(shù),參數(shù)用引號引起來.
join:格式:列表|join:’#’
示例:
<h1>{{list|join:’,’}}</h1>
如果一個變量沒有被提供,或者值為false、空,可以使用默認值
格式:{{var|default:’沒有’}}
根據(jù)給定格式轉換日期為字符串
Date:格式:{{dateVal|date:’y-m-d’}}
HTML轉義: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>目前沒有學生</li>
{% endfor %}
</ul>
注釋
單行注釋
{# 注釋的內(nèi)容 }
多行注釋
{% comment %}
dfg
dfggh
gh
{% endcomment %}
反向解析
鏈接 此時如果url正則變了,那么所有的鏈接就都要修改。使用反向解析可以解決這個問題 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’%}’>
此時,無論怎么修改url正則,都不會影響頁面中的任何url
模板繼承
作用:模板繼承可以減少頁面的內(nèi)容的重復定義,實現(xiàn)頁面的重用 Block標簽:在父模板中預留區(qū)域,子模板去填充
語法:{% block 標簽名 %}{% endblock 標簽名%}
一個模板中可以定義多個block塊
Extends標簽:繼承模板,需要寫在模板文件的第一行
語法:{% 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轉義
后臺傳過來的HTML代碼字符串,如果不轉義,他就會當成普通字符串渲染。
將接收到的HTML字符串解析成HTML進行渲染 {{code}} {{code|escape}} {{code|safe}} {% autoescape off %} {{code}} {% endautoescape %}
csrf跨站請求偽造
某些惡意網(wǎng)站包含鏈接、表單、按鈕、js,利用登錄用戶在瀏覽器中認證從而攻擊服務。 防止CSRF: 在settings.py文件中的中間件配置增加csrf的配置,默認配置好了。但是加完了,自己也登錄不了了。 我們自己訪問,需要在我們的表單中添加{% csrf_token %}
驗證碼
def verifycode(request):
# 引入繪圖模塊
from PIL import Image, ImageDraw, ImageFont
# 引入隨機函數(shù)模塊
import random
# 定義變量,用于畫面的背景色、寬、高
bgcolor = (random.randrange(20, 100), random.randrange(20, 100), random.randrange(20, 100)) width = 100 height = 50
# 創(chuàng)建畫面對象
im = Image.new('RGB',(width, height),bgcolor)
# 創(chuàng)建畫筆對象
draw = ImageDraw.Draw(im)
# 調(diào)用畫筆的point()函數(shù)繪制噪點
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)
# 定義驗證碼的備選值
str = '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPLKJHGFDSAZXCVBNM'
# 隨機選取四個值作為驗證碼
rand_str = ''
for i in range(0,4):
rand_str += str[random.randrange(0, len(str))]
# 構建字體對象
font = ImageFont.truetype(r'C\Windows\Fonts\AdobeArabic-Bold.otf', 40)
# 構建字體顏色
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))
# 繪制四個字
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 , 用于做進一步驗證
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')