2011-10-02 93 views
2

我使用的是文件上传在我的Django模型是这样的:文件上传保存在Django管理

def upload_path(self, filename): 
    return 'upload/actualities/%s/%s' % (self.id, filename) 

photo = models.ImageField(upload_to=upload_path) 

和我adminModel是:

from actualities.models import * 
from django.contrib import admin 

class ActualityAdmin(admin.ModelAdmin): 
    class Media: 
     js = ('/static/js/tiny_mce/tiny_mce.js', '/static/js/textareas.js') 

admin.site.register(Actuality, ActualityAdmin) 

一切正常,除非我编辑罚款因为它有一个id。但是当我创建它时,文件上传发生在模型保存之前...因此,我将文件放入/media/actualities/None/filename.jpg,并且我想要/media/2/filename.jpg

如何保存模型后可以强制文件上传吗?

谢谢!!!

+0

不确定它是否可能:生成的文件名保存在您的实例中,因此如果您之前强制保存,则必须使用新文件名再次保存实例。 –

回答

1

解决方法是,尝试为文件名(而不是使用self.id)生成UUID。

+0

这是一个解决方案,但我认为使用文件夹名称的id可能更容易。如果我找不到我的路,我会使用你的解决方案。非常感谢! – Sebastien

+0

这个解决方案很好,但这意味着你的上传文件夹不是非常有组织的... – Sebastien

2

您可能会想要重写模型的save()方法,也许会想出一个自定义的“不要做任何事情”UploadHandler,然后切换回原来的并再次调用save。

https://docs.djangoproject.com/en/dev/topics/http/file-uploads/

https://docs.djangoproject.com/en/dev/topics/db/models/

我想在这种情况下做的不过是使该关将文件保存到一些临时空间自定义上传处理程序。然后,我会覆盖将文件从临时文件移动到任何想要的位置的保存方法(在mixin中)。

@ Tomek的答案也是另一种方式。如果你有你的模型生成它自己的ID,那么你可以使用它。

倒数第二个建议是我对照片博客所做的,而不是将所有图像保存在media/2/filename.jpg目录中。我通过上传日期保存图像。 2011/10/2/image.jpg这样可以帮助任何目录变得过于笨拙。

最后,您可以散列文件名并将它们存储在散列名称的目录中,以便将这些图像均匀散布到目录中。

我选择了日期样式,因为这对于那个项目来说很有意义。也许有另外一种方法可以命名图像进行保存,这意味着您可以使用这个问题,而不仅仅是“模型与id 2的图片”。

祝你好运!

+0

基于日期的目录结构+1 –