django 模版-標籤-視圖-csrf-token-模版繼承-HTML過濾器

"""
******模版******

--定義模版--
**變量**
視圖傳遞給模版的數據
注意1:要遵照標識符規則
語法:{{var(即變量)}}
若是使用的變量不存在,則插入的是空字符串
在模版中使用點的語法,
1.先當字典查詢來處理
2.屬性或者方法
3.數字索引
舉例:
VIEWS中定義以下:
def index11(request):
    student = Students.objects.get(pk=1)
    return render(request,'users/index11.html',{'stu':student})
模版中調用以下:
<h1>{{ stu.sname }}</h1>


在模版中調用對象的方法:
1.在models中定義一個方法
def getName(self):
    return self.sname
2.views中定義以下:
def index11(request):
    student = Students.objects.get(pk=1)
    return render(request,'users/index11.html',{'stu':student})
模版中調用以下:
<h1>{{ stu.getName }}</h1>
注意:模版不能傳遞附加的參數
在models中定義一個方法以下,如下這樣的方式是不能夠的
def getName(self,str):
    return self.sname+str



**標籤**
語法:{% tag %}
做用:
1.在輸出中建立文本
2.控制邏輯和循環
if
格式1:
{% if 表達式 %}
語句
{% endif %}
格式2:
{% if 表達式1 %}
語句1
{% else %}
語句2
{% endif %}
格式3:
{% if 表達式1 %}
語句1
{% elif 表達式2%}
語句n
{% else %}   #這個無關緊要
語句e
{% endif %}
示例:
{% if num %}
    <h1>hello world</h1>
{% endif %}

for
格式1:
{% for 變量 in 列表 %}
語句1
{% empty %}  #這個無關緊要,這個是列表爲空或者列表不存在,執行語句2
語句2
{% endfor %}

格式2:
{% for 變量 in 列表 %}
語句1
{% endfor %}

格式3:
{{forloop.counter}}   #表示當前是第幾循環
示例1:
{% for line in studdd %}
    <li>{{ forloop.counter }}--{{ line.sname }}-{{ line.sgrade }}</li>
{% empty %}
    <li>目前沒有學生</li>
{% endfor %}
示例2:
{% for line in stud %}
    {% if forloop.counter|divisibleby:2 %}
        <li style="color:red">{{ forloop.counter }}--{{ line.sname }}-{{ line.sgrade }}</li>
    {% else %}
        <li style="color:blue">{{ forloop.counter }}--{{ line.sname }}-{{ line.sgrade }}</li>
    {% endif %}
{% empty %}
    <li>目前沒有學生</li>
{% endfor %}


comment
做用:註釋多行,不緊能夠註釋標籤,也能夠注意變量
格式:
{% comment%}
<h1>學生</h1>
{{stu.student}}
{%endcomment%}
單行註釋用: {# 註釋內容 #}

ifequal/ifnotequal
做用:判斷是否相等或者不相等
格式:
{% ifequal 值1 值2%}  #若是值1與值2相等就執行下面的語句,不相等就不執行
語句
{% endifequal %}
示例:
{% ifequal 'ok' 'ok' %}
    <h1>學生要加油</h1>
{% endifequal %}

include
做用:加載模版並以標籤內容的參數渲染
格式:{% include '模版目錄' 參數1 參數2 %}

url
做用:反向解析
格式:{% url 'namespacename' p1 p2 %}
主url
urlpatterns = [
    # path('admin/', admin.site.urls),
    url(r'^',include('users.urls',namespace='app')),
]
次url
app_name ='app3'
urlpatterns = [
    url(r'^food/(\d+)/(\d+)/$', views.good,name='good'),
]
視圖views
def good(request,id,id3):
    return render(request,'users/good.html',{'num':id,'num3':id3})
html中
<a href="{% url 'app:good' 5 3%}">跳轉</a>
跳轉到good.html
<h1>{{ num }}</h1>
<h1>{{ num3 }}</h1>


csrf_token
做用:用於跨站請求僞造保護
某些網站包含連接、表單、按鈕、JS會利用咱們登錄的用戶在瀏覽器中認證,從而攻擊服務
防止csrf有兩種方法
第一種:
1.在setting中MIDDLEWARE里加上'django.middleware.csrf.CsrfViewMiddleware',
2.在表單中{% csrf_token %}
第二種:
驗證碼:在用戶註冊,登錄頁面時候使用,爲了防止暴力請求,減輕服務器的壓力,防止CRSF一種方式!
1.安裝pillow模塊
2.在views中配置一個def ,以下代碼,用於生成圖片驗證碼的函數
# -*- coding:utf-8 -*-
from django.shortcuts import HttpResponse
def verifycode(request):
    # 引入繪圖模塊
    from PIL import Image,ImageDraw,ImageFont
    #引入隨機函數模塊
    import random
    #定義變量,用於畫面的背景色,寬,高
    bgcolor = (random.randrange(20,100),random.randrange(20,100),random.randrange(20,100))
    width = 100
    height = 50
    #建立畫面對象
    im = Image.new('RGB',(width,height),bgcolor)
    #建立畫筆對象
    draw = ImageDraw.Draw(im)
    #調用畫筆的point()函數繪製噪點
    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 = '1234567890QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm'
    #隨機選取4個值做爲驗證碼
    rand_str = ''
    for i in range(0,4):
        rand_str += str[random.randrange(0,len(str))]
    #構造字體對象 把C盤的字體文件放到其它盤,由於C盤字體文件路徑很差找
    font = ImageFont.truetype("E:\simsunb.ttf", 36)
    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))
    #繪製4個字
    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
    # request.session['verifycode'] = rand_str
    #內存文件操做
    import io
    buf = io.BytesIO()
    #將圖片保存在內存中,文件類型爲png
    im.save(buf,'png')
    #將內存中的圖片數據返回給客戶端,MIME類型爲圖片png
    return HttpResponse(buf.getvalue(),'image/png')
#備註:
# code1 = request.session['verify'] 【登陸獲取圖片上的驗證碼】
#code2 = request.POST.get('verifycode') 【獲取登陸表單上輸入的驗證碼】
3.配置url
    url(r'^verifycode/$',views.verifycode),
    url(r'^verifycodefile/$',views.verifycodefile),
    url(r'^verifycodecheck/$',views.verifycodecheck),
4.建立html
<body>
    <form action="/verifycodecheck/" method="post">
        {% csrf_token %}
        <input type="text" name="yanzheng" />
        <img src="/verifycode/">
        <input type="submit" value="登錄" />
        <span>{{ flag }}</span>
    </form>
</body>
5.再次配置views
from django.shortcuts import redirect
def verifycodefile(request):
    ff = request.session.get('shibai',True)
    str = ''
    request.session.clear()
    if ff == False:
        str = "驗證碼輸入錯誤,請從新輸入"
    return render(request,'users/verifycodefile.html',{'flag':str})

def verifycodecheck(request):
    code1 = request.POST.get('yanzheng').upper()
    code2 = request.session['verifycode'].upper()
    print(code1,code2)
    if code1 == code2:
        request.session.clear()
        return render(request,'users/succese.html')
    else:
        request.session['shibai']= False
        return redirect('/verifycodefile/')




模版繼承
做用:模版繼承能夠減小頁面內容的重複定義,實現頁面的重用
block標籤  在父模版中預留區域,子模版去填充
語法:
{% block 標籤名 %}
{% endblock 標籤名 %}
父模版:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        #header{
            width:100%;
            height: 100px;
            background-color:red;
        }
        #footer{
            width:100%;
            height: 100px;
            background-color:blue;
        }
    </style>
</head>
<body>
    <div id = "header">header</div>
    <div id = "main">
        {% block main%}
        {% endblock main %}
        <hr/>
        {% block main2%}
        {% endblock main2 %}
    </div>
    <div id = "footer">footer</div>
</body>
</html>

extends標籤  繼承模版,須要寫在模版文件的第一行
語法:
{% extends 'users/base.html' %}
{% block main %}
    <h1>ok,my</h1>
{% endblock main %}
{% block main2 %}
    <h1>suck,is kaige</h1>
{% endblock main2 %}


HTML轉義
舉例:
return render(request,'users/index11.html',{'code':'<h1>suck is hao de </h1>'})

<h1>{{ code|safe }}</h1>  #轉義一個
#下面是同時轉義多個
<h1>
    {% autoescape off %}
        {{ code }}
    {% endautoescape %}




**過濾器**
語法:{{var(即變量)|過濾器}}
做用:再變量被顯示前修改它
過濾器的種類:
1、lower 小寫
2、upper 大寫 例:<h1>{{ str|upper }}</h1>
3、過濾器能夠傳遞參數,參數用引號引發來:
1.join  格式  列表|join:'#'   列表|join:'鏈接的東西'
例:<h1>{{ list|join:'#' }}</h1>
4、若是一個變量沒有被提供,或者值爲False,空,能夠使用默認值
1.default
格式:{{var|default:'good'}}
例:<h1>{{ lis4t|default:'godd' }}</h1>
5、根據給定的格式轉換日期爲字符串
1.date
格式:{{ dateval|date:'y-m-d'}}
6、HTML轉義
1.escage
7、加減乘除
<h1>{{ num|add:10 }}</h1>
<h1>{{ num|add:-5 }}</h1>
<!--num/1*5(num除以1乘5)後面必須帶兩個值,格式規定-->
<h1>{% widthratio num 1 5%}</h1>
<!--num/5*1(num除以5乘1)-->
<h1>{% widthratio num 5 1%}</h1>

標籤:include
加載模板(帶參數渲染)
格式:{% include '模板位置' with 參數1 參數2 參數3..... %}
舉例:{% include 'index_context.html'%}


"""
相關文章
相關標籤/搜索