Django model.ImageFiled 圖片的上傳及顯示

做項目中的一個坑。。
本來覺得在model里面定義了ImageFiled,能簡化MySQL存取圖片。事實上在讀取靜態(tài)圖片的時候確實很方便,只需要相對路徑正確即可哨查。
eg:

/show.html

<html>
<body>
#假裝此處有靜態(tài)文件夾
<img src="/static/{{image.url}}"
</body>
</html>

但是當需要讀取到用戶自己上傳的圖片的時候,路徑的問題就暴露出來了剧辐。

Step1 建立一個有ImageFiled的model

image/model.py

class Image(models.Model):
     image = models.ImageField(upload_to='images/',verbose_name='圖片')

     class Meta:
         verbose_name='圖片測試'
         verbose_name_plural = verbose_name

step2 在setting中建立圖片的上傳路徑

settings.py

import os
...
MEDIA_ROOT = os.path.join(BASE_DIR,'media')  #圖片存取的絕對路徑
MEDIA_URL = '/media/'  #圖片存取的相對路徑
...

Step 3 創(chuàng)建圖片上傳的Views

image/views.py

'''
為了做試驗隨便寫的views
'''
from django.shortcuts import render
from django import forms
from django.views import View

from image.models import image
# Create your views here.


class ImageForm(forms.ModelForm):

    class Meta:
        model = image
        fields = '__all__'


class ImageUploadView(View):
    def get(self,request):
        imageform = ImageForm
        return render(request,'upload.html',{'image':imageform})
    def post(self,request):
        imageform = ImageForm(request.POST,request.FILES)
        imageform.image = request.FILES.get('image','')
        imageform.save()
        return render(request,'show.html',{})


class ImageShowView(View):
    def get(self,request):
        images = image.objects.all()
        return render(request,'show.html',{'images':images})

Step 4 配置URL

urls.py

from django.contrib import admin
from django.conf.urls import url
from image.views import ImageUploadView,ImageShowView
urlpatterns = [
    url('admin/', admin.site.urls),
    url('upload/$',ImageUploadView.as_view()),
    url('show/$',ImageShowView.as_view())
]

Step5 Templates

這個隨便寫寫就好了

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>upload</title>
</head>
<body>
<form method="post" enctype="multipart/form-data">{% csrf_token %}
    {{ image.as_p }}
    <input type="submit" value="提交">
</form>
</body>
</html>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>show</title>
</head>
<body>
<h1>這是圖片↓</h1>
{% for imageobj in images %}
<img src="{{ imageobj.image.url }}">
{% endfor %}
</body>
</html>
以上的步驟都沒有坑寒亥,但是當你啟動好項目邮府,滿心歡喜想要看到上傳的圖片的時候

明明路徑是對的溉奕,然鵝褂傀,Django覺得這個路徑可能是別人家的

Step 6 將路徑靜態(tài)

試試把這個路徑靜態(tài)了

urls.py

from django.contrib import admin
from django.conf.urls import url
from django.conf import settings
from django.conf.urls.static import static

from image.views import ImageUploadView,ImageShowView
urlpatterns = [
    url('admin/', admin.site.urls),
    url('upload/$',ImageUploadView.as_view()),
    url('show/$',ImageShowView.as_view())
]+static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

呵,圖片能夠顯示了加勤。
于是繼續(xù)滿心歡喜地用到了正在進行的項目中



hehe

貌似有的地方還是不能用

Step7 繼續(xù)查

圖片也是路徑誒仙辟,所以試著在urls.py加上一個匹配。
在許多博客里也找到了類似的操作鳄梅,Django document中也有類似的說法


CSDN上的一些博客中的操作

During development, you can serve user-uploaded media files from MEDIA_ROOT using the django.views.static.serve() view.

加入了類似的匹配之后


我也不知道之前博主是怎么跑起來的叠国。。戴尸。粟焊。可能Django的版本不同孙蒙,給改了项棠?
通過pycharm查看'django.views.static.serve',發(fā)現(xiàn)serve就是一個函數(shù)挎峦,應該是可以用來做callback的香追。

from djang.views.static import serve
...
urlpatterns = [
    url('admin/', admin.site.urls),
    url('upload/$',ImageUploadView.as_view()),
    url('show/$',ImageShowView.as_view()),
    url('media/(?P<path>.*)$', serve, {'document_root': settings.MEDIA_ROOT}),
]

又能使用了。坦胶。為了避免白高興一場透典,在自己的項目里面加入試一下



為什么圖片能顯示了想著還是那么難受。

兩個同樣方式創(chuàng)建的項目迁央,在step6同樣的操作一個能正常顯示出數(shù)據(jù)庫中的圖片掷匠,一個卻不能。岖圈。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市钙皮,隨后出現(xiàn)的幾起案子蜂科,更是在濱河造成了極大的恐慌,老刑警劉巖短条,帶你破解...
    沈念sama閱讀 216,997評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件导匣,死亡現(xiàn)場離奇詭異,居然都是意外死亡茸时,警方通過查閱死者的電腦和手機贡定,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,603評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來可都,“玉大人缓待,你說我怎么就攤上這事蚓耽。” “怎么了旋炒?”我有些...
    開封第一講書人閱讀 163,359評論 0 353
  • 文/不壞的土叔 我叫張陵步悠,是天一觀的道長。 經(jīng)常有香客問我瘫镇,道長鼎兽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,309評論 1 292
  • 正文 為了忘掉前任铣除,我火速辦了婚禮谚咬,結果婚禮上,老公的妹妹穿的比我還像新娘尚粘。我一直安慰自己择卦,他們只是感情好,可當我...
    茶點故事閱讀 67,346評論 6 390
  • 文/花漫 我一把揭開白布背苦。 她就那樣靜靜地躺著互捌,像睡著了一般。 火紅的嫁衣襯著肌膚如雪行剂。 梳的紋絲不亂的頭發(fā)上秕噪,一...
    開封第一講書人閱讀 51,258評論 1 300
  • 那天,我揣著相機與錄音厚宰,去河邊找鬼腌巾。 笑死,一個胖子當著我的面吹牛铲觉,可吹牛的內(nèi)容都是我干的澈蝙。 我是一名探鬼主播,決...
    沈念sama閱讀 40,122評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼撵幽,長吁一口氣:“原來是場噩夢啊……” “哼灯荧!你這毒婦竟也來了?” 一聲冷哼從身側響起盐杂,我...
    開封第一講書人閱讀 38,970評論 0 275
  • 序言:老撾萬榮一對情侶失蹤逗载,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后链烈,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體厉斟,經(jīng)...
    沈念sama閱讀 45,403評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,596評論 3 334
  • 正文 我和宋清朗相戀三年强衡,在試婚紗的時候發(fā)現(xiàn)自己被綠了擦秽。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,769評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖感挥,靈堂內(nèi)的尸體忽然破棺而出缩搅,到底是詐尸還是另有隱情,我是刑警寧澤链快,帶...
    沈念sama閱讀 35,464評論 5 344
  • 正文 年R本政府宣布誉己,位于F島的核電站,受9級特大地震影響域蜗,放射性物質發(fā)生泄漏巨双。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,075評論 3 327
  • 文/蒙蒙 一霉祸、第九天 我趴在偏房一處隱蔽的房頂上張望筑累。 院中可真熱鬧,春花似錦丝蹭、人聲如沸慢宗。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,705評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽镜沽。三九已至,卻和暖如春贱田,著一層夾襖步出監(jiān)牢的瞬間缅茉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,848評論 1 269
  • 我被黑心中介騙來泰國打工男摧, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蔬墩,地道東北人。 一個月前我還...
    沈念sama閱讀 47,831評論 2 370
  • 正文 我出身青樓耗拓,卻偏偏與公主長得像拇颅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子乔询,可洞房花燭夜當晚...
    茶點故事閱讀 44,678評論 2 354