標籤:提交 code 補充 doctype patch create 前台 files pre
目錄
一、django的URL應用
二、django的視圖應用
三、django的模板應用
四、django的orm應用
補充:
補充一:getlis
應用情境:當前端發送的資料為多個的時候,後台如果還用get擷取資料,那麼就會出問題,所以這裡有一個getlist方法進行資料的擷取。
實驗案例:當前端有一個多選的checkbox的時候,那麼就要使用getlist進行擷取資料了
urlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^getlist‘, views.getlist),]
urls.py
def getlist(request): if request.method == ‘GET‘: return render(request,‘getlist.html‘) else: checkbox = request.POST.getlist(‘interest‘) print(checkbox) return HttpResponse(checkbox)
views.py
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body><form action="/getlist" method="post"> <div> 興趣愛好調查問卷 </div> <span>男</span> <input type="checkbox" name="interest" value="1"> <span>女</span> <input type="checkbox" name="interest" value="2"> <span>無要求</span> <input type="checkbox" name="interest" value="3"> <input type="submit" value="提交"></form></body></html>
html代碼
查看結果:
同樣select標籤的使用方法也是一樣的
補充二:上傳檔案
學過了從前台擷取資料(單個的資料、多個的資料),那如何從前台擷取一個檔案呢?這裡要說一下擷取檔案就不能用request.POST進行get了,
需要使用request.FILES進行資料擷取了。
寫一個上傳檔案的案例:
urlpatterns = [ url(r‘^admin/‘, admin.site.urls), url(r‘^upload/‘, views.upload),]
urls.py
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title></head><body>{# enctype="multipart/form-data"如果提交的資料是檔案的話,那麼就得在form表單裡面寫上這句話 #} <form action="/upload/" method="POST" enctype="multipart/form-data"> <p> <input type="file" name="file"/> </p> <input type="submit" value="提交"/> </form></body></html>html代碼
from django.shortcuts import render,HttpResponsefrom django.views import View# Create your views here.def upload(request): if request.method == ‘GET‘: return render(request,‘upload.html‘) elif request.method == ‘POST‘: # 擷取到前台傳過來的檔案,如果直接print obj的話,會列印上傳檔案的檔案名稱; # 其實他接收到的並不是一個檔案名稱,可以列印一些obj的類型,結果是一個類的對象 obj = request.FILES.get(‘file‘) import os # 在obj.name前面加上一個upload目錄 最後目錄路徑是 upload/上傳的檔案名稱字 # 這裡的obj.name就是調用name屬性,屬性值為上傳的檔案名稱字 file_pat = os.path.join(‘upload‘,obj.name) f = open(file_pat,‘wb‘) print(os.path) # 迴圈擷取上傳的資料 for i in obj.chunks(): f.write(i) f.close() return render(request,‘upload.html‘) else: return render(request,‘upload.html‘)
Views.py主邏輯 django的URL應用
django的視圖應用
FBV (funaction base view) ----> 我們之前學的url路由關係都是一個請求過來由url進行匹配,看匹配到那個方法直接去views.py代碼體裡面進行相應發方法尋找,然後進行邏輯處理。
CBV (Class base view) -----> 現在說一個cbv的模式,模式是這樣,當請求過來後,也是由url進行匹配,這次匹配到的不是一個方法,而是一個類。
那麼CBV是怎麼工作的呢? 看代碼:
urlpatterns = [ url(r‘^admin/‘, admin.site.urls), #FBV url(r‘^home/‘, views.Home.as_view()), #CBV]
urls.py
from django.shortcuts import render,HttpResponsefrom django.views import View #引入一個django裡面View模組# 定義這類class Home(View): # 這裡是利用類的映射進行操作的,可以看一下父類View裡面有一個dispatch方法。當使用get請求的時候 # 就會執行下面的get方法。。。 def get(self,request): print(request.method) return render(request,‘home.html‘) def post(self,request): print(request.method) return render(request,‘home.html‘)
Views.py
django一共給我們提供了這麼多的請求方式,我們來梳理一下過程:
也就是說,在執行我們定義的方法之前肯定會先執行父類裡面的dispatch方法,那麼既然這樣,我們就可以搞點事情了。想想“裝飾器”,看代碼:
class Home(View): def dispatch(self,request,*args,**kwargs): print(‘befor‘) result = super(Home,self).dispatch(request,*args,**kwargs) print(‘after‘) return result # 這裡是利用類的映射進行操作的,可以看一下父類View裡面有一個dispatch方法。當使用get請求的時候 # 就會執行下面的get方法。。。 def get(self,request): print(request.method) return render(request,‘home.html‘) def post(self,request): print(request.method) return render(request,‘home.html‘)
views.py
這裡列印的befor和after是不是就類似於我們我們之前學的裝飾器呢?
我們再來梳理一下現在的流程:
第一步:瀏覽器通過任何方式的請求把資料包發送到伺服器的urls路由系統中
第二步:urls路由系統進行匹配請求的url,發現匹配到一個class,把請求轉給對應的class
第三步:對應的class在自己內部找到dispatch方法,首先執行自己增加的代碼塊
第四步:從整合的父親那裡擷取該請求是什麼方式的請求
第五步:父類告訴子類請求的方式是什麼
第六步:子類尋找自己內部對應的請求方方式的function並執行代碼塊,並把資料返回給瀏覽器
1
人生苦短,我用python-- Day19 django架構之URL路由系統、視圖應用、模板應用、django之orm應用