Django upload_to 在 MEDIA_ROOT 之外

Posted

技术标签:

【中文标题】Django upload_to 在 MEDIA_ROOT 之外【英文标题】:Django upload_to outside of MEDIA_ROOT 【发布时间】:2010-12-16 06:56:08 【问题描述】:

我的部署脚本覆盖了媒体和源目录,这意味着我必须将上传目录移出媒体目录,并在提取上传文件后替换它。

如何指示 django 上传到 /uploads/ 而不是 /media/?

到目前为止,我不断收到 django 可疑操作错误! :(

我想另一种解决方案可能是符号链接?

非常感谢, 托比。

【问题讨论】:

更重要的是,为什么你的部署脚本会覆盖上传的内容? 它不会覆盖上传,因为我先将目录从媒体目录中复制出来。我正在尝试上传到不同的目录,这样我就可以覆盖媒体而无需移动上传。 【参考方案1】:

我做了以下事情:

from django.core.files.storage import FileSystemStorage

upload_storage = FileSystemStorage(location=UPLOAD_ROOT, base_url='/uploads')

image = models.ImageField(upload_to='/images', storage=upload_storage) 

UPLOAD_ROOT 在我的settings.py 文件中定义:/foo/bar/webfolder/uploads

【讨论】:

干得好。我刚刚在我正在为工作编写的应用程序中使用 django 文件字段。我可能最终也会走这条路。【参考方案2】:

虽然接受的答案可能是您想要的,但我们现在可以选择django 3.1,我们可以通过将函数传递给ImageFieldFileField 的存储参数来决定在运行时使用哪个存储.

def select_storage():
    return MyLocalStorage() if settings.DEBUG else MyRemoteStorage()


class MyModel(models.Model):
    my_file = models.FileField(storage=select_storage)

看看官方docs.

请注意,当前接受的答案会将变量UPLOAD_ROOT 的实际值写入迁移文件。当您将其应用于数据库时,这不会产生任何 SQL,但如果您经常更改该设置可能会造成混淆。

【讨论】:

以上是关于Django upload_to 在 MEDIA_ROOT 之外的主要内容,如果未能解决你的问题,请参考以下文章

django 内置upload_to

Django FileField with upload_to 在运行时确定

Django 静态文件与动态文件

django 在模板中使用 MEDIA URL

Django MEDIA_URL 和 MEDIA_ROOT

django imagefield 如何去除clear