2013-06-19 54 views
1

我正處於一個非常奇怪的問題。爲什麼file.url在django中返回與file.path相同的值?

我有聲明如下模型中的默認值的FileField:

class MyModel(models.Model): 
    name = models.CharField(max_length=32) 
    audio_file = models.FileField(upload_to='user_menus/', default='%suser_menus/default.mp3' % settings.MEDIA_ROOT, blank=True, null=False) 

現在,當我做了以下

>>> a = MyModel(name='Foo') 
>>> a.save() 
>>> a.audio_file.path 
'/full/path/to/file' 
>>> a.audio_file.url 
'/full/path/to/file' # again 

我有我的MEDIA_ROOT和MEDIA_URL配置如下

MEDIA_ROOT = os.path.join(os.path.dirname(__file__), 'static/') 
MEDIA_URL = '/media/' 

我錯過了什麼嗎? 有什麼建議嗎?

預先感謝您。

+0

您可以在模板中看到差異,它預先顯示url域。這是區別:https://docs.djangoproject.com/en/dev/topics/files/#using-files-in-models – karthikr

回答

3

您需要在字段的缺省值中指定要保存在數據庫中的實際值(字符串),而不是完整路徑。這就是爲什麼.url顯示這種方式。對於你的情況應該是這樣的:

audio_file = models.FileField(upload_to='user_menus/', default='%suser_menus/default.mp3' % settings.MEDIA_URL, blank=True, null=False) 

請注意,我只是覺得當default被插入到數據庫中,你會遇到此問題。

希望這會有所幫助!

+0

謝謝,我試圖這樣做,並得到SuspicipusOperation錯誤。 :-( – israelord

+0

用'slashes'稍微玩一下,試試'upload_to ='user_menus'',有時會發生這種情況,我編輯了我的答案,而不是硬連線'/ media'路徑,我用你的方式去做它使用'MEDIA_URL'而不是'MEDIA_ROOT'。 –

+0

我改變了默認值,如下所示:default = user_menus/defaul.mp3它解決了這個問題。非常感謝您 – israelord

2

有幾件事我不認爲你需要,這可能會或可能不會導致問題。我有以下代碼在生產中完美工作(Django 1.5)。 models.py:

... 
    decision_file = models.FileField(
     upload_to = "guidance", 
     blank = True, 
     help_text = "20MB maximum file size." 
    ) 
... 

而且在我的基地settings.py:我定義爲靜態和媒體文件不同的路徑和URL

MEDIA_ROOT = os.path.join(os.path.dirname(__file__), '../../media') 

MEDIA_URL = '/media/' 

STATIC_ROOT = os.path.join(os.path.dirname(__file__), '../../static/') 

STATIC_URL = '/static/' 

通知。我認爲您不應該在默認情況下將% settings.MEDIA_ROOT包含在格式字符串中(請參閱Paulo Bu的回答),也可以使用upload_to參數中的尾部斜槓。

總之

  1. 檢查上傳文件夾存在;
  2. 設置單獨的靜態和媒體路徑和URL;
  3. 從您的默認中刪除格式字符串;和
  4. upload_to參數

刪除斜線,你應該有工作代碼。

相關問題