下面是实现Django admin后台显示图片缩略图的完整攻略。
步骤一:安装必要的依赖库
在本例中,我们将使用 Django-cleanup 和 Pillow 两个库来实现显示缩略图的功能。可以在命令行中使用以下命令进行安装:
pip install django-cleanup Pillow
步骤二:处理数据库
假设我们有一个模型名为 Photo
,其中有一个字段为 image
,用来保存图片。我们需要将其改为使用 Django 的 ImageField,代码如下:
from django.db import models
class Photo(models.Model):
image = models.ImageField(upload_to='photos')
# 其他字段
upload_to
参数表示文件上传的路径,这里设置为 'photos',则上传的图片会保存在MEDIA_ROOT/photos 目录中。
接下来,运行以下命令来执行数据库迁移:
python manage.py makemigrations
python manage.py migrate
步骤三:使用 Django-cleanup 进行图片处理
由于我们的模型中使用了 ImageField 字段保存图片,为了避免出现无用的图片数据,我们使用 Django-cleanup 库,在图片数据被删除时自动删除相应的文件。在 INSTALLED_APPS
包含了 django_cleanup
应用之后,我们需要在模型中添加 cleanup 和 thumbnail 两个字段,可以通过重载 save 方法实现:
from django.db import models
from django.utils.html import format_html
from django.conf import settings
from django_cleanup import cleanup
from PIL import Image
class Photo(models.Model):
image = models.ImageField(upload_to='photos')
thumbnail = models.ImageField(upload_to='thumbnails', null=True, blank=True)
def save(self, *args, **kwargs):
super(Photo, self).save(*args, **kwargs)
if self.image:
image_path = self.image.path
thumb_name = 'thumb_' + self.image.name.split('/')[-1]
thumb_path = settings.MEDIA_ROOT + '/thumbnails/' + thumb_name
if not self.thumbnail:
with Image.open(image_path) as img:
img.thumbnail((300, 300))
img.save(thumb_path)
self.thumbnail = 'thumbnails/' + thumb_name
else:
with Image.open(image_path) as img:
img.thumbnail((300, 300))
img.save(thumb_path)
self.thumbnail.name = 'thumbnails/' + thumb_name
super(Photo, self).save(*args, **kwargs)
cleanup(self)
def admin_thumbnail(self):
if self.thumbnail:
return format_html('<img src="{}" width="100" />'.format(self.thumbnail.url))
else:
return ''
admin_thumbnail.short_description = 'Thumbnail'
在这个示例中,我们将创建一个 thumbnail
字段,用于保存缩略图数据。在 save 方法中,我们使用 Pillow 库进行图片处理,生成缩略图,并将其保存到 MEDIA_ROOT/thumbnails
目录中。如果没有缩略图,则将其保存到数据库中。我们还使用 admin_thumbnail
方法生成图片的缩略图并在 admin 后台中显示。
步骤四:在 admin 后台中显示缩略图
在 admin.py 文件中,我们可以通过重载 list_display 方法来添加缩略图的显示:
from django.contrib import admin
from .models import Photo
class PhotoAdmin(admin.ModelAdmin):
list_display = ('id', 'admin_thumbnail', 'image')
admin.site.register(Photo, PhotoAdmin)
在这个示例中,我们使用 list_display 参数,添加 'admin_thumbnail' 字段,使其显示在列表中。这将调用我们在模型中添加的 admin_thumbnail
方法,并显示缩略图。
示例说明
以下是两条示例说明:
示例一:上传图片
在网站后台页面中,找到 'Photo' 模型,上传一张图片并保存。可以看到,缩略图已经生成,并显示在列表中。
示例二:删除图片
在网站后台页面中,找到 'Photo' 模型,选择一张图片,点击删除按钮,可以看到对应的缩略图文件也被删除。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Django 实现admin后台显示图片缩略图的例子 - Python技术站