2 つの異なるシステムで使用されるデータベースがあり、その結果、次のように 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 アプリ内で使用すると先頭のスラッシュを削除できません。/
例
マニュアル用の PDF ファイルを含む Tool というレコードを想像してみてください。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>
2 番目のサーバーの例では、絶対 URL である必要があります。
したがって、明確にするために:
- 2 番目のサーバーは Django プロジェクトではありません
- 最初のサーバーよりも 2 番目のサーバーでコードを変更すると、はるかに時間がかかります。
- したがって、FileField の値は、Django との互換性を保つために絶対 URL である必要がありますが、2 番目のサーバーとの互換性を保つには、先頭にスラッシュを付けて保存する必要があります。