模型保存在Django admin后上传文件

时间:2011-10-02 14:42:57

标签: django file-upload django-admin

我在我的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)

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

如何在模型保存后强制上传文件?

谢谢!!!

2 个答案:

答案 0 :(得分:2)

你可能想要覆盖Model的save()方法,也许想出一个自定义的“不做任何事”UploadHandler,然后切换回原来的那个并再次调用save。

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

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

但是,在这种情况下,我会做一个自定义上传处理程序,将文件保存到某个临时空间。然后我覆盖了将文件从temp移动到你想要的任何地方的save方法(在mixin或其他东西中)。

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

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

最后,您可以对文件名进行哈希处理,并将它们存储在哈希名称的目录中,以便在目录中均匀分布图像。

我选择了日期样式,因为这对我的项目有意义。也许还有另一种方法可以命名一个图像来保存,这意味着比“id 2的图片模型”更多的东西,你可以用来解决这个问题。

祝你好运!

答案 1 :(得分:1)

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