2015-10-12 104 views
11

我對使用哪個字段有點困惑。我需要的只是一個字段,將保存一個文件(音頻和/或另一個圖像)使用Django FileField或FilePathField?

FileField似乎是專門用於上傳,我認爲這是一個矯枉過正的我需要的東西,我也不喜歡每次上傳文件時它會自動上傳文件並將其重命名爲唯一的文件名(file_FHjgh758.txt)。

我與FilePathField的問題是,它似乎需要一個絕對路徑,這顯然是不同的,從開發到生產,我身邊這讓加入到這個模型......

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

感謝您的回答,這對我來說很有意義,儘管我被困在如何從模板中調用文件位置。如果我調用保存在數據庫中的url,它就像'/home/../../',而html試圖使它相對於不正確的開發服務器。我想我失去了一些東西很明顯這裏 – deltaskelta

+2

我認爲這個問題是'FilePathField'意味着更多的位於服務器上是無法通過Web服務器訪問...如果你想公開的文件,那麼你最好使用文件'FileField'具有'url'屬性,它還將文件保存在一個可訪問的位置(在你的'MEDIA_ROOT'中)。您可以覆蓋'FileField'的保存行爲以防止隨機後綴。 – solarissmoke

+1

感謝您的跟進,如果我沒有弄錯,我還應該在urls.py中輸入一個條目,並處理進入/ media文件夾的請求。這是正確的還是這也危險? – deltaskelta