""" ******模版****** --定義模版-- **變量** 視圖傳遞給模版的數據 注意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'%} """