我正在转换一个旧站点(最初是用 rails 编写的),默认情况下,图像是使用该格式保存的{{pk}}.{{extension}}
,如果上传了新文件,该文件总是会被覆盖。我想用这个 django 版本继续这种格式。
我最初认为扩展 FileSystemStorage 是一种方法,但我不知道将当前模型对象传递给它的方法。有人对“django 方式”有什么建议吗?
如果我需要编写自己的扩展类ImageField
来管理它,那就这样吧。:) 只是想知道我是否缺少一些简单的东西。
[编辑]我做了什么,基于surfeurx和DrTyrsa 的回答:
temp_image = None
def image_path(self, uploaded_file_name):
prefix = 'designs/'
extension = os.path.splitext(uploaded_file_name)[-1]
if self.pk != None:
return prefix + str(self.pk) + extension
else:
tmp_name = str(uuid.uuid4())
self.temp_image = prefix + tmp_name + extension
return self.temp_image
image_upload = models.ImageField(upload_to=image_path, null=True, blank=True)
def save(self):
self.updated_at = datetime.now()
is_new = self.pk == None
super(Design, self).save()
if is_new:
if self.temp_image != None:
os.rename(MEDIA_ROOT + self.temp_image, MEDIA_ROOT + self.image_path(self.temp_image))
self.temp_image = None
我现在遇到的真正问题是我希望它覆盖图像。这将提供正确的文件名,但看起来我将不得不扩展ImageField
以使其覆盖。找到了这个小家伙:http ://djangosnippets.org/snippets/636/