Django模板層的擴(kuò)展

模板層

模板烤宙,其實(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')
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末嚷节,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子虎锚,更是在濱河造成了極大的恐慌硫痰,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窜护,死亡現(xiàn)場(chǎng)離奇詭異效斑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)柱徙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門缓屠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奇昙,“玉大人,你說我怎么就攤上這事敌完〈⒛停” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵蠢挡,是天一觀的道長弧岳。 經(jīng)常有香客問我,道長业踏,這世上最難降的妖魔是什么禽炬? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮勤家,結(jié)果婚禮上腹尖,老公的妹妹穿的比我還像新娘。我一直安慰自己伐脖,他們只是感情好热幔,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著讼庇,像睡著了一般绎巨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上蠕啄,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天场勤,我揣著相機(jī)與錄音,去河邊找鬼歼跟。 笑死和媳,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的哈街。 我是一名探鬼主播留瞳,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼骚秦!你這毒婦竟也來了她倘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤作箍,失蹤者是張志新(化名)和其女友劉穎帝牡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蒙揣,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年开瞭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了懒震。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罩息。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖个扰,靈堂內(nèi)的尸體忽然破棺而出瓷炮,到底是詐尸還是另有隱情,我是刑警寧澤递宅,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布娘香,位于F島的核電站,受9級(jí)特大地震影響办龄,放射性物質(zhì)發(fā)生泄漏烘绽。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一俐填、第九天 我趴在偏房一處隱蔽的房頂上張望安接。 院中可真熱鬧,春花似錦英融、人聲如沸盏檐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽胡野。三九已至,卻和暖如春痕鳍,著一層夾襖步出監(jiān)牢的瞬間硫豆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國打工额获, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留够庙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓抄邀,卻偏偏與公主長得像耘眨,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子境肾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容