既然到這一步了就缆,我們就需要在主頁(yè)的html文件里面添加相應(yīng)的上傳功能帖渠。要想實(shí)現(xiàn)上傳功能,我們就要在html文件制作一個(gè)‘表單’竭宰。
為什么要做表單呢空郊,我們?cè)谶@里照顧一下對(duì)HTML沒(méi)有概念的同學(xué)。
比如切揭,我們需要客戶做一個(gè)調(diào)查狞甚,拿個(gè)最簡(jiǎn)單的例子,我們打算做一個(gè)名為question.html
的網(wǎng)頁(yè)來(lái)收集客戶的性別情況廓旬,自然而然地我們就應(yīng)該在頁(yè)面上有這樣的內(nèi)容:
<input type="text" name="your gender"/>
<input type="submit" name="" value="提交" />
首先我們需要有一個(gè)輸入框給客戶填入性別哼审,就是這個(gè) <input type="text" name="your gender"/>
然后我們需要一個(gè)按鈕,也就是<input type="submit" name="" value="提交" />(類型是submit就說(shuō)明這是一個(gè)按鈕)
這兩個(gè)東西組合起來(lái)就算是HTML文件里面最簡(jiǎn)單的表單,按照HTML的規(guī)則涩盾,在HTML中應(yīng)該用一個(gè)<form>標(biāo)簽把他們?nèi)ζ饋?lái)十气,正確應(yīng)該是這樣
<form action="result.html">
<input type="text" name="the_gender" value="input your gender">
<input type="submit" name="" value="OK" />
</form>
<form action="result.html">表示,客戶填完性別春霍,點(diǎn)擊按鈕的時(shí)候砸西,就會(huì)把里面的有用的信息比如客戶的性別信息放到request里面一起提交到result.html
因此,相關(guān)的網(wǎng)絡(luò)架構(gòu)址儒,不管是php芹枷,還是django都需要通過(guò)分析這些request信息來(lái)對(duì)客戶進(jìn)行回饋。
比如在django的框架中离福,我們就需要負(fù)責(zé)result.html的講解員來(lái)分析信息杖狼。而這些信息在哪里呢?就在request里面妖爷。
所以蝶涩,我們需要的result講解員應(yīng)該是這樣
def result_jiangjieyuan(request):
visitor_gender= request['the_gender']
if visitor_gender == "男":
return HttpResponse("Hello ,你的性別是男,因此,你很有可能喜歡看葫蘆娃")
elif visitor_gender=="女"
return HttpResponse("Hello ,你的性別是女,因此絮识,你很有可能喜歡逛淘寶" )
我們網(wǎng)頁(yè)的請(qǐng)求有兩種绿聘,我們一般到一個(gè)網(wǎng)頁(yè),使用的是一種叫GET 的方法次舌,也就是說(shuō)熄攘,我們打開(kāi)瀏覽器,輸入地址彼念,那么瀏覽器就會(huì)發(fā)出一個(gè)request挪圾,這個(gè)request的方法是GET。這種方法有個(gè)不好的地方是逐沙,能傳輸客戶的信息量比較少哲思,而且不太安全,信息會(huì)顯示在URL欄里面吩案,所以棚赔,我們?cè)趥鬏敱韱螖?shù)據(jù)的時(shí)候必須得使用POST方法。而且徘郭,用這個(gè)方法也可以區(qū)分客戶是不是提交了表單而來(lái)的靠益。
所以我們把question.html里面的表單修改一下,指明提交表單時(shí)使用的提交方法
<form action="result.html" method='POST'>
<input type="text" name="the_name" value="input yourname">
<input type="text" name="the_gender" value="input your gender">
<input type="submit" name="" value="OK" />
</form>
負(fù)責(zé)result.html的講解員應(yīng)該是這樣的:
def result_jiangjieyuan(request):
if request.method == 'GET':
return "對(duì)不起残揉,你是通過(guò)瀏覽器輸入result.html直接到達(dá)結(jié)果頁(yè)面胧后,您沒(méi)有提交任何表單,所以我們不能做出任何分析抱环,請(qǐng)您先到調(diào)查問(wèn)卷的頁(yè)面填寫(xiě)表單绩卤。"
elif request.method =='POST':
#這說(shuō)明客戶是通過(guò)提交表單過(guò)來(lái)的
visitor_gender= request.POST['the_gender']
if visitor_gender == "男":
return HttpResponse("Hello , 你的性別是男途样,因此,你很有可能喜歡看葫蘆娃" )
elif visitor_gender=="女"
return HttpResponse("Hello ,你的性別是女濒憋,因此,你很有可能喜歡逛淘寶" )
于是我們完成了一個(gè)非常非常簡(jiǎn)單的表單陶夜,上面的表單需要客戶填入字符串凛驮,然后提交字符串,而我們的云盤(pán)則是需要客戶選擇本地的文件条辟,然后提交文件黔夭。其實(shí)也差不多。
我們需要需要將上面的form稍加修改
<form action="result.html" method="POST" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="myfile" required />
<br>
<input type="submit" name="" value="OK" />
</form>
其中的enctype是必須的羽嫡,這是一種對(duì)提交文件進(jìn)行編碼上傳的方式本姥,我們不用過(guò)多理會(huì),輸入的類型當(dāng)然就是“file”
還有就是 {% csrf_token %} 這是django防止表單惡意提交的安全驗(yàn)證機(jī)制杭棵,我們按照django規(guī)則放進(jìn)去就好了婚惫,不需理會(huì)。
我們把這個(gè)表單放進(jìn)我們的index.html吧魂爪。
<!doctype html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Home Page</title>
</head>
<body>
注:這里應(yīng)該有<img src=先舷。。滓侍。 /> 蒋川,其中。撩笆。捺球。= "static/logo.png" ,簡(jiǎn)書(shū)一直渲染成別的東西了夕冲,大家注意一下
<p>Welcome</p>
<p>{{ jiangjieyu1 }}</p>
<form action="result.html" method="POST" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="myfile" required />
<br>
<input type="submit" name="" value="OK" />
</form>
</body>
</html>
我們從上面可以看到氮兵,我們的數(shù)據(jù)會(huì)以post的方式提交到result.html頁(yè)面,我們?cè)谀抢镓?fù)責(zé)的講解員需要把數(shù)據(jù)存到數(shù)據(jù)庫(kù)耘擂,然后給用戶一個(gè)反饋胆剧,告訴他是否上傳成功。如果成功醉冤,我們就回到主頁(yè)秩霍,如果不成功,則在result頁(yè)面輸出不成功的字眼蚁阳。怎么把數(shù)據(jù)存到數(shù)據(jù)庫(kù)呢铃绒,我們先用一句
data=request.FILES['myfile']
把上傳的文件從請(qǐng)求里面取出放到data變量里面,
然后我們引用我們之前在models.py設(shè)計(jì)好的數(shù)據(jù)類螺捐,制作成一個(gè)小的數(shù)據(jù)單元(專業(yè)術(shù)語(yǔ)颠悬,一條記錄)矮燎,也就是數(shù)據(jù)庫(kù)表單中的一行。我們說(shuō)過(guò)赔癌,我們的數(shù)據(jù)結(jié)構(gòu)需要三個(gè)欄目诞外,一個(gè)是id,默認(rèn)的灾票,我們不要管峡谊,第二個(gè)是文件數(shù)據(jù),這里我們傳入data刊苍,第三個(gè)是上傳日期既们,由于我們開(kāi)啟了自動(dòng)添加模式,所以也不需要管了正什,所以這里生成這條記錄只需要一個(gè)參數(shù)啥纸,也就是文件數(shù)據(jù)就可以了,也就是下面的這條代碼
file = fileModel(myfile=data)
然后這條記錄就生成了婴氮,我們需要把這條記錄保存到數(shù)據(jù)庫(kù)里面也很簡(jiǎn)單
file.save()
搞定
于是斯棒,我們需要招聘一位負(fù)責(zé)result的講解員來(lái)負(fù)責(zé)這些功能,由于result頁(yè)面主要是一些功能性的東西而不是展示性的莹妒,我們甚至可以不需要實(shí)體的result.html文件名船,由講解員口述就可以了。
所以旨怠,我們?cè)趈iangjieyuan_mingdan.py中添加一個(gè)新的result_jiangjieyuan函數(shù)渠驼,在反饋給客戶是否上傳成功時(shí),如果成功則返回主頁(yè)鉴腻,不成功則告訴用戶不成功迷扇。這里我們用到了重定向的函數(shù),所以要引用一下rediect
from django.shortcuts import render,redirect
# Create your views here.
from django.http import HttpResponse
from datetime import date
from .models import fileModel
def index_jiangjieyuan(request):
today = str(date.today())
word = "hello, today is " + today
return render(request,'index.html',{'jiangjieyu1':word})
def result_jiangjieyuan(request):
if request.method == 'POST':
data=request.FILES['myfile']
file = fileModel(myfile=data)
file.save()
return redirect('/')
else:
return HttpResponse("Sorry the uplaod is unsucessful.")
此外爽哎,還要記得在myCloud目錄下的urls.py文件里面把result.html的請(qǐng)求交給result_jiangjieyuan來(lái)處理
這時(shí)蜓席,你再運(yùn)行服務(wù)器就可以使用上傳文件的功能了。也就是說(shuō)课锌,你能夠成功把數(shù)據(jù)記錄到數(shù)據(jù)庫(kù)了厨内,但是,這時(shí)你會(huì)發(fā)現(xiàn)渺贤,你的myCloud目錄并沒(méi)有看到傳上來(lái)的文件雏胃,那是因?yàn)椋蟼鞯奈募景埃琩jango會(huì)把它當(dāng)做是一種MEDIA文件瞭亮,我們需要設(shè)置MEDIA路徑才能把文件傳到服務(wù)器上。我們這里把上傳上來(lái)的文件也當(dāng)做是服務(wù)區(qū)的靜態(tài)文件固棚,因此统翩,我們把static文件夾當(dāng)做是MEDIA的路徑仙蚜。當(dāng)然,你也可以另外新建一個(gè)文件夾作為MEDIA路徑厂汗。
因此委粉,settings.py里面添加一行代碼
MEDIA_ROOT = os.path.join(BASE_DIR, 'myCloud\static\media')
意思是我們將上傳文件的父路徑設(shè)為myCloud/static/media/
這時(shí)候你再上傳文件就可以看到,media文件夾里面自動(dòng)生成了upload文件夾面徽,然后里面有你上傳的文件艳丛。
總結(jié)一下,我們需要的做工作:
1.在index.html文檔添加HTML表單的內(nèi)容趟紊,用來(lái)收集用戶的資料(在我們的案例中,就是用戶的文件)
2.聘請(qǐng)result_jiangjieyuan負(fù)責(zé)文件的從request中的提取工作碰酝,此外還要負(fù)責(zé)將文件存進(jìn)數(shù)據(jù)庫(kù)
3.設(shè)置URL霎匈,讓上傳的請(qǐng)求能夠轉(zhuǎn)交給result_jiangjieyuan來(lái)處理
以上三點(diǎn)都是必須的,不分先后送爸。