Django模板層的擴展

模板層

模板,其實就是一個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')
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容