我在我的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
如何在模型保存后强制上传文件?
谢谢!!!
答案 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)。