【发布时间】:2011-08-09 19:19:21
【问题描述】:
我正在开发一个 Django 项目,在该项目中应该允许用户一次上传多个图像。除非您有更好的建议,否则该项目的这一部分可能会由 SWFUpload 处理。
图像重命名、调整大小和缩略图创建将由django-stdimage2 处理。
问题
django-stdimage2 使用字段名称和对象主键重命名每个图像。
如果主键为 1 的齿轮排存在五张图片,则所有五张图片都将重命名为“image_1.jpeg”。
在介绍可能的解决方案之前,先介绍一下我的模型。 基本上,一个齿轮行可以有很多个 gear_image 行。
class gear(models.Model):
id = models.AutoField(primary_key=True)
model = models.CharField(max_length=100)
class gear_images(models.Model):
id = models.AutoField(primary_key=True)
gear_id = models.ForeignKey(gear)
image = StdImageField(upload_to='images/gear', blank=True, size=(640, 480, True), thumbnail_size=(100, 100, True))
解决方案
我正在考虑在文件名中添加一个时间戳,以毫秒为单位并四舍五入。
我既不是 Python 也不是 Django 专业人士,但我在 django-stdimage2 的 fields.py 文件中四处寻找,我想我找到了需要编辑以使其工作的代码。
注释掉的两行代码是我提出的解决方案:
def _rename_resize_image(self, instance=None, **kwargs):
'''
Renames the image, and calls methods to resize and create the thumbnail
'''
if not kwargs.get('raw', None):
if getattr(instance, self.name):
filename = getattr(instance, self.name).path
ext = os.path.splitext(filename)[1].lower().replace('jpg', 'jpeg')
# time_stamp = int(round(time.time() * 1000))
# dst = self.generate_filename(instance, '%s_%s_%s%s' % (self.name, instance._get_pk_val(), time_stamp, ext))
dst = self.generate_filename(instance, '%s_%s%s' % (self.name, instance._get_pk_val(), ext))
dst_fullpath = os.path.join(settings.MEDIA_ROOT, dst)
if os.path.normcase(os.path.abspath(filename)) != os.path.normcase(os.path.abspath(dst_fullpath)):
os.rename(filename, dst_fullpath)
if self.size:
self._resize_image(dst_fullpath, self.size)
if self.thumbnail_size:
thumbnail_filename = self._get_thumbnail_filename(dst_fullpath)
shutil.copyfile(dst_fullpath, thumbnail_filename)
self._resize_image(thumbnail_filename, self.thumbnail_size)
setattr(instance, self.attname, dst)
instance.save()
每个图像名称都类似于:image_1_159753456.jpeg
你认为这是一个很好的解决方法吗?我也对其他想法持开放态度。
谢谢你:)
【问题讨论】: