我正在开发一个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 pro,但是我在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
你认为这是一个很好的解决方案吗?我也对其他想法持开放态度。
谢谢:)
答案 0 :(得分:0)
我认为你根本没有问题。
django-stdimage {2}将重命名为gear_images模型的对象ID,而不是其父齿轮模型。因此,一个齿轮可以有许多图像,每个齿轮都会将gear_images pk附加到文件名中。
实际上,如果您在文件名中使用齿轮模型的pk而不是gear_images pk,那么您只会遇到问题。如果你对后者没问题,那么你不需要做任何事情,它应该可以正常工作。