Django FileField 保存 url 而不是数据库中的路径

Posted

技术标签:

【中文标题】Django FileField 保存 url 而不是数据库中的路径【英文标题】:Django FileField save the url instead of the path in the database 【发布时间】:2014-01-16 02:50:45 【问题描述】:

我的表单上有一个 FileField。 我喜欢它的行为方式,将文件写入 MEDIA_ROOT 等。 我想更改它写入数据库的内容。 如果我查看数据库,我会看到路径.. /home/user/media/path/to/file.txt 我希望它写的是没有域 /media/file.txt 的 URL 路径 是否有要传递给 ModelForm 或 Model 的参数? 如果不是,我要覆盖哪个类?

将绝对路径写入数据库似乎是一种不好的做法。我需要能够动态更改 MEDIA_ROOT 和 MEDIA_URL。并且可能与其他只需要媒体 URL 的非 django 应用程序共享这个数据库。

【问题讨论】:

【参考方案1】:

我没有看到将 URL 保存在数据库中的方法,但是您可以在数据库中保存相对路径。我想您已将 upload_to 设置为绝对路径。您可以将其更改为相对于您的MEDIA_ROOT 的路径,例如`upload_to="path/to/"。另请参阅official Documentation 关于这件事。

【讨论】:

我理解这种方法,但我希望记录是 '/media/path/to/file.txt' 和 upload_to='path/to/'。 @sk1p 的答案似乎是更好的选择,否则你在数据库中的“绝对性”有同样的问题,除了它是一个绝对 url 而不是绝对路径......换句话说,如果你有理由要更改MEDIA_URL,那么您的数据将被破坏,但这样做@sk1p 的方式任何更改都由MEDIA_ROOTMEDIA_URL 设置处理

以上是关于Django FileField 保存 url 而不是数据库中的路径的主要内容,如果未能解决你的问题,请参考以下文章

Django MEDIA_URL 返回 https 而不是 http

如何在 Django 的 FileField 中保存来自传入电子邮件的附件?

Django - 如何创建文件并将其保存到模型的 FileField?

使用 model.FileField 在 Django 中保存之前修改文件名

如何将 NamedTemporaryFile 保存到 Django 中的模型 FileField 中?

使用 FileField 在 Django 中保存原始文件名