我正在转换遗留站点(最初用rails写入),默认情况下使用格式{{pk}}.{{extension}}
保存图像,并且如果上传新文件,该文件总是被覆盖。 我想继续使用这个Django版本的格式。Django ImageField/FileField使用模型的pk保存上传的文件
我原本以为扩展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/
谢谢!这帮了很多。虽然我觉得很脏。这似乎是我用django编写过的最不优雅的东西。 – oliverseal