自從學了Django,哪兒哪兒都是坑啊,首先就是版本的坑,網上找了1.6版本的代碼用在2.0身上,當然搞不定了。以下是針對Django2.0版本,如何才能在自帶的管理後臺顯示圖片,我查瞭解決辦法很多,這個又快又方便。
下面是剛開始遇到的問題,點擊“圖片”列下的鏈接會報錯找不到圖片,sample列下的圖片都無法正確顯示,:如圖
在這裏插入圖片描述
原來無法正確顯示圖片的代碼如下:
配置settings.py,添加一個上傳圖片或者文件指定目錄
MEDIA_URL = 'static/media/'#
MEDIA_ROOT=os.path.join(BASE_DIR,'static/media')#
STATIC_URL = '/static/'#靜態文件目錄
配置app模型models.py
from django.db import models
from django.utils.safestring import mark_safe
class PicTest(models.Model):
# 這裏設置的文件夾會自動生成保存在你在settings.py中定義的靜態圖片目錄裏
pic = models.ImageField(u'圖片',upload_to='mywork_img/%Y/%m/%d',null=True,blank=True,)
name= models.CharField(u'圖片名稱',max_length=32,default="")
# 列表顯示,return 返回的是圖片的地址
def admin_sample(self):
return mark_safe('<img src="%s" height="50" width="50" />'%(self.pic,))
admin_sample.short_description = 'Sample'
admin_sample.allow_tags = True
class Meta:
db_table = "mywork_pictest"
verbose_name = 'piclist'
verbose_name_plural = verbose_name
def __str__(self):
return self.admin_sample
配置admin.py
from django.contrib import admin
from mywork.models import PicTest
class PicTestAdmin(admin.ModelAdmin):
list_display = ('name','pic','admin_sample')
admin.site.register(PicTest,PicTestAdmin)
根路由urls.py 默認不動
from django.contrib import admin
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
]
------經過修改後代碼(只列出修改過或新添加的語句或段):--------
settings.py
MEDIA_ROOT =BASE_DIR#os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/'
models.py
from mang.settings import MEDIA_URL
def admin_sample(self):
return mark_safe('<img src="%s%s" height="50" width="50" />'%(MEDIA_URL,self.pic,))
admin.py
無變化
urls.py
from django.contrib import admin
from django.urls import path
from mang.settings import MEDIA_ROOT #導入項目設置文件 獲得MEDIA_ROOT定義的路徑
from django.urls import re_path #從原生urls類中導入重定向路徑方法
from django.views.static import serve # server
urlpatterns = [
path('admin/', admin.site.urls),
# 重定向靜態文件的讀寫路徑(原來1.6的版本用的是url,坑苦我了,又去翻文檔)
re_path(r'^media/(?P<path>.*)$', serve, {"document_root": MEDIA_ROOT}),
#re_path(r'^media/(?P<path>.*)$', serve, {"document_root": MEDIA_ROOT}),
# path('media/(<str:path>.*)', serve, {"document_root": MEDIA_ROOT})
]
修改後的效果:點擊圖片列下的鏈接可以直接打開圖片,地址應該是重新定義了,右側也可以顯示新添加的圖片。
再加一個,點擊圖片也能查看,實際就是給圖片做個超鏈接,
return mark_safe('<a href="%s%s"><img src="%s%s" height="50" width="50" /></a>'%(MEDIA_URL,self.pic,MEDIA_URL,self.pic,))