1. 程式人生 > 其它 >django使用ImageFied上傳並顯示圖片

django使用ImageFied上傳並顯示圖片

技術標籤:python-django-tornado-flaskdjangoImageField

文章目錄

一、上傳圖片指定upload_to

 file = models.ImageField(upload_to=resource_upload_to,   verbose_name="資原始檔")

resource_upload_to 為要上傳到resource目錄下的路徑, 可以自己指定,也可以通過隨機數或者md5的方式來保證上傳的檔案唯一, 該方法resource_upload_to() 直接放到model類下即可。

  def resource_upload_to(instance, filename):
        dir_path = time.strftime('%Y/%m/%d')

        ts = str(time.strftime("%Y%m%d%H%M%S"))
        md5 = hashlib.md5()
        md5.update((filename + ts).encode('utf-8'))
        d = md5.hexdigest()

        return dir_path + '/' + d + '_' + filename

二、配置上傳根目錄resource

在主配置檔案settings.py檔案裡,新增配置,指定上傳的檔案目錄為根目錄:

MEDIA_ROOT = os.path.join(BASE_DIR, 'resource')
MEDIA_URL = '/resource/'

訪問圖片資源

配置好圖片後,我們可以根據re_path來匹配到resource目錄下的檔案:

from django.urls import path, re_path
urlpatterns = [
re_path(r'^resource/(?P<path>.*)$', views.get_resource),
]

訪問地址:

localhost:8000/resource/path , 即可獲取到上傳到的圖片資源,其中path為upload_to裡的值,即相對路徑。

三、優化圖片顯示

  1. 我們可以在admin.py檔案裡新增物件用來展示圖片,只需要在model定義渲染圖片的方法, 使用 format_html()方法將自定義的圖片連結標籤新增到model裡:
class Seal(TimestampModel):
    url = models.ImageField(verbose_name="圖片地址", null=True, blank=True)

    class Meta:
        verbose_name_plural = "圖片"
        verbose_name = "圖片"
        db_table = "sys_seal"

    def image_display(self):
        return format_html('<a href="{}"><img src="{}" width="48px" height="48px"/></a>'
                           , self.url.url, self.url.url)

	# 指定admin頁面顯示的欄位名稱
    image_display.short_description = "印章圖片"
  1. 將 image_display 新增到admin.py檔案裡的list_display檔案裡,同時可以將該欄位新增到list_editable了列表裡。
class SealAdmin(BaseAdmin):
    list_display = ("description", "url", 'image_display')
    list_filter = ("description",)
    search_fields = ["description"]
    list_editable = ['url', ]
    list_per_page = 20
    ordering = ["id"]
  1. djang的後臺頁面上就會展示出 對應urll以及 image_display對應的圖片顯示,會直觀清楚很多!
    在這裡插入圖片描述