Django新手教程11,上傳文件與制作表單

既然到這一步了就缆,我們就需要在主頁(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>
image.png
image.png

我們從上面可以看到氮兵,我們的數(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.")
image.png

此外爽哎,還要記得在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)都是必須的,不分先后送爸。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末铛嘱,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子袭厂,更是在濱河造成了極大的恐慌墨吓,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纹磺,死亡現(xiàn)場(chǎng)離奇詭異帖烘,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)橄杨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門(mén)秘症,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人式矫,你說(shuō)我怎么就攤上這事乡摹。” “怎么了采转?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵聪廉,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我故慈,道長(zhǎng)板熊,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任惯悠,我火速辦了婚禮邻邮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘克婶。我一直安慰自己筒严,他們只是感情好丹泉,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著鸭蛙,像睡著了一般摹恨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上娶视,一...
    開(kāi)封第一講書(shū)人閱讀 49,166評(píng)論 1 284
  • 那天晒哄,我揣著相機(jī)與錄音,去河邊找鬼肪获。 笑死寝凌,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的孝赫。 我是一名探鬼主播较木,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼青柄!你這毒婦竟也來(lái)了伐债?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤致开,失蹤者是張志新(化名)和其女友劉穎峰锁,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體双戳,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡虹蒋,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了拣技。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片千诬。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖膏斤,靈堂內(nèi)的尸體忽然破棺而出徐绑,到底是詐尸還是另有隱情,我是刑警寧澤莫辨,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布傲茄,位于F島的核電站,受9級(jí)特大地震影響沮榜,放射性物質(zhì)發(fā)生泄漏盘榨。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一蟆融、第九天 我趴在偏房一處隱蔽的房頂上張望草巡。 院中可真熱鬧,春花似錦型酥、人聲如沸山憨。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)郁竟。三九已至玛迄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間棚亩,已是汗流浹背蓖议。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留讥蟆,地道東北人勒虾。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像瘸彤,于是被迫代替她去往敵國(guó)和親从撼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理钧栖,服務(wù)發(fā)現(xiàn),斷路器婆翔,智...
    卡卡羅2017閱讀 134,601評(píng)論 18 139
  • 本文包括:1拯杠、文件上傳概述2、利用 Commons-fileupload 組件實(shí)現(xiàn)文件上傳3啃奴、核心API——Dis...
    廖少少閱讀 12,517評(píng)論 5 91
  • HTML表單 在HTML中潭陪,表單是 ... 之間元素的集合,它們?cè)试S訪問(wèn)者輸入文本最蕾、選擇選項(xiàng)依溯、操作對(duì)象等等,然后將...
    蘭山小亭閱讀 3,410評(píng)論 2 14
  • 為什么設(shè)計(jì)過(guò)程中需要文檔: 1瘟则、統(tǒng)一認(rèn)識(shí):項(xiàng)目主線黎炉、設(shè)計(jì)決定等2、深入理解3醋拧、求本溯源和有所交代 為什么交付件要規(guī)...
    友交互閱讀 599評(píng)論 1 2
  • 1. 那之后慷嗜,我經(jīng)常對(duì)著那本書(shū)出神。 書(shū)的名字叫《羽·青空之藍(lán)》丹壕。 我把頭埋在胳膊里庆械,在夏...
    JOULE焦耳閱讀 184評(píng)論 0 0