django使用ImageFied上傳並顯示圖片
阿新 • • 發佈:2020-12-16
技術標籤: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),
]
訪問地址:
三、優化圖片顯示
- 我們可以在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 = "印章圖片"
- 將 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"]
- djang的後臺頁面上就會展示出 對應urll以及 image_display對應的圖片顯示,會直觀清楚很多!