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,我们可以通过将函数传递给ImageField
或FileField
的存储参数来决定在运行时使用哪个存储.
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 之外的主要内容,如果未能解决你的问题,请参考以下文章