2015-10-12 6 views
11

私は、使用するフィールドについて少し混乱しています。私が必要とするのは、ファイル(オーディオや画像用の別のファイル)を保持するフィールドだけです。Django FileFieldまたはFilePathFieldを使用するには?

FileFieldはアップロード用のようですが、私が必要とするものはあまりにも多すぎると思います何かがアップロードされるたびに、ファイルを自動的にアップロードして一意のファイル名(file_FHjgh758.txt)に名前を変更する方法も嫌いです。

FilePathFieldと私が持っている問題は、それは絶対パスを必要とするように思われることである、明らかに生産へのDEVは異なるだろうこれ、私がモデルにこれを追加することで、この周りだ...

import os 

class Foo(models.Model): 

    path = os.path.dirname(os.path.dirname(__file__)) 
    path = os.join(path, 'media') 
    audio = models.FilePathField(path=path) 

これは安全で適切かどうかわかりませんが、オンラインやドローイングの文書はあまりありません。

明確にするために、私は自分のシステムのどこかのファイル(オーディオまたはイメージ)を指すことができるフィールドを持っているだけです。これを行う最善の方法は何でしょうか?

答えて

11

ユーザがアップロードしたファイルではなくファイルシステム上にすでに存在するファイルを参照する場合は、FilePathFieldが必要です。この点で

いくつかのコメント:

  • は、アプリケーションのソースツリー内にあるパスにないポイントを実行してください。それは安全ではありません。

  • あなたは、生産・パス対などの開発を扱う開発/制作設定ファイルにFILE_PATH_FIELD_DIRECTORY設定を入れて、あなたのアプリから、この設定を参照するための設定や環境変数を使用することができます。

    from django.conf import settings 
    
    class Foo(models.Model): 
        audio = models.FilePathField(path=settings.FILE_PATH_FIELD_DIRECTORY) 
    
+1

あなたの答えをありがとう、これは私には意味がありますが、私はテンプレートからファイルの場所を呼び出す方法に固執しています。私がdbに保存されているURLを呼び出すと、 '/home/../../'のようなものになり、htmlはdevサーバとの間で相対的なものにしようとします。私はここで明らかに何かが不足していると思います。 – deltaskelta

+2

私は問題は、FilePathFieldは、サーバー上にあるWebサーバーからアクセスできないファイルを意味します...パブリックファイルを使用する場合は、 'FileField'は' url'属性を持ち、ファイルを(MEDIA_ROOTの中で)アクセス可能な場所に保存します。ランダムな接尾辞を避けるために 'FileField'の保存動作を変更することができます。 – solarissmoke

+1

フォローアップのおかげで、私が誤解されていないなら、urls.pyにエントリを作成し、/ mediaフォルダーに入ってくるリクエストを処理するビューも作成する必要がありますか?それは正しいのですか、それとも危険ですか? – deltaskelta

関連する問題