我有一个由两个不同系统使用的数据库,因此我实际上需要 FileField 值有一个前导斜杠,如下所示:
/dirs/filename.ext
然而,在 Django 中,FileField 值不能有前导斜杠,因为它破坏了它们与MEDIA_ROOT
.
所以我怀疑我要么必须创建一个自定义存储类,要么以某种方式自定义 FileField,以便在读取时删除前导斜杠并在保存时恢复。
如果有人想知道我为什么要这样做:我将文件镜像到单独的非Django服务器上。
在 Django 服务器上,文件是相对于媒体根目录的。因此,假设媒体根目录为/path/to/myapp/media
,则具有该路径的文件dirs/filename.ext
将存在于/path/to/myapp/media/dirs/filename.ext
.
同时,当镜像到另一台服务器时,它们是相对于 webroot 存储的。所以路径等价于文件的绝对URL(例如文件dirs/filename.ext
存储在/path/to/example.com/dirs/filename.ext
,访问为http://example.com/dirs/filename.ext
)。
两台服务器都使用相同的数据库。
我意识到一个解决方案是在另一台服务器上使用该字段的任何地方都添加一个斜杠,但这是跨越许多不同的源文件,而在 Django 中,由于记录模型,我应该能够仅在models.py
文件中进行更改它将适用于整个 Django 站点。
到目前为止,我已经尝试创建一个自定义版本,FileField
它正确地预先设置/
了查找和保存,但是在 Django 应用程序中使用时,我无法让它删除前导斜杠。
例子
想象一个名为 Tool 的记录,其中包含一个 PDF 文件作为其手册。在 Django 服务器上,它将因此显示在模板中:
<h1>{{ tool.name }}</h1>
<p>{{ tool.description }}</p>
<p><a href="{{ MEDIA_URL }}{{ tool.file.url }}">Link to Manual</a></p>
同时在另一台服务器上它更像(这是 CF 代码):
<h1>#GetTool.tool_name#</h1>
<p>#GetTool.tool_description#</p>
<p><a href="#GetTool.tool_file#">Link to Manual</a></p>
在第二个服务器示例中,它必须是绝对 URL。
所以,要清楚:
- 第二台服务器不是 Django 项目
- 在第二台服务器上更改代码会比在第一台服务器上更耗时
- 因此 FileField 中的值需要是绝对 URL 才能与 Django 兼容,但需要使用前导斜杠保存以便与第二个服务器兼容。