Django的form表單之檔案上傳

2021-09-20 01:16:37 字數 2828 閱讀 8058

在生成input標籤的時候可以指定input標籤的型別為file型別

}

此時,在網頁上頁示如下

如果網頁上提交的是使用者名稱和密碼等,通過鍵值對傳送到服務端。

一組鍵值代表乙個標籤及標籤對應的值。

在網頁上選擇一張,並使用post方式提交,在服務端列印request.post

def index(request):

if request.method=="post":

print(request.post)

return render(request,"index.html",locals())

列印的資訊如下:

提交的檔名也在這個字典中,取出這個檔名

def index(request):

if request.method=="post":

print(request.post.get("up_file"))

print(type(request.post.get("up_file")))

return render(request,"index.html",locals())

列印結果如下:

1.png

想取出的是上傳的檔案,然而取出來的卻是上傳的檔案的檔名

由此可知,上傳的檔案沒有跟form表單提交的資料在一起

因為上傳的檔案通常大小比較大,所以django缺省會把上傳的檔案放在乙個具體的資料夾中

列印request.files的資訊

def index(request):

if request.method=="post":

print(request.post.get("up_file"))

print(type(request.post.get("up_file")))

print("files:",request.files)

return render(request,"index.html",locals())

列印結果如下

1.png

files:

request.files列印的結果是乙個空的字典,問題出在上傳檔案的方式上

由於上傳檔案時在客戶端與服務端傳輸的是二進位制資料,與字串資料不一樣。

傳輸二進位制資料,不管是在form表單,還是在ajax中,都有自己的傳輸方式。

在form表單中,上傳檔案時要使用分片傳輸的方式。

修改index.html檔案

}

重新上傳檔案,在服務端列印資訊如下

none

files: ]}>

根據列印結果,request.files中可以看到上傳的檔案

列印結果是乙個字典型別,字典的鍵是form表單中定義的標籤的name屬性值,而其值是所上傳的檔案的物件

列印上傳檔案的物件

def index(request):

if request.method=="post":

print("files:",request.files.get("up_file"))

print(type(request.files.get("up_file")))

return render(request,"index.html",locals())

列印結果

files: 1.png

結果顯示所取得的檔案的型別是乙個在記憶體中的上傳檔案

獲取上傳檔案在記憶體中的名字

def index(request):

if request.method=="post":

print(type(request.files.get("up_file")))

file_obj=request.files.get("up_file")

print(file_obj.name)

return render(request,"index.html",locals())

列印結果如下

1.png
既然知道了檔案在記憶體中的名字,就可以在服務端寫入這個檔案

def index(request):

if request.method=="post":

file_obj=request.files.get("up_file")

f1=open(file_obj.name,"wb")

for i in file_obj.chunks():

f1.write(i)

f1.close()

return render(request,"index.html",locals())

再次選擇上傳檔案,提交後,就可以在服務端後台看到所上傳的檔案

可以在settings.py檔案中設定上傳檔案的路徑,或者在開啟檔案控制代碼的時候進行路徑拼接來把上傳的檔案儲存在指定的目錄下

Django學習筆記之form表單

表單是通過類實現的,繼承自forms.form,然後在裡面定義要驗證的字段.在表單中,建立欄位跟模型是一模一樣的,但是沒有null true或者blank true等這幾種引數了,有的引數是required true false.使用is valid 方法可以驗證使用者提交的資料是否合法,而且htm...

django學習 Form表單

在驗證某個欄位的時候,可以傳遞乙個validators引數用來指定驗證器,對資料進行進一步的過濾。驗證器有很多,但是很多驗證器我們其實已經通過這個field或者一些引數就可以指定了。比如emailvalidator,我們可以通過emailfield來指定,比如maxvaluevalidator,我們...

Django之form表單提交並驗證

1.提交的時候會報錯 2.需要在setting裡面注釋掉一句話,關閉跨站請求檢查。3.注釋掉以後,理論上就不報錯了。可我還是卡殼了。4.通過在網上找方法,修復錯誤。原因 表單action欄位沒有以 結尾,將action 修改為 action a b 即可修復。將action欄位修正如下 這裡需要說明...