做項目中的一個坑。。
本來覺得在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 thedjango.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}),
]
又能使用了。坦胶。為了避免白高興一場透典,在自己的項目里面加入試一下