2011-04-20 17 views
1

我來自PHP的背景,但已經給了一個Django項目來管理,我把它帶到一個運行Django 1.2.5(Python2.6)的新服務器上,並且這一切都像舊的一樣運行。我現在的任務是修復舊開發人員的錯誤。目前爲止這麼好,但我用ImageField碰到了一個絆腳石。基本上,用戶可以上傳圖片徽標(這是可行的)。然而,當無標識用戶編輯他們的細節的Django拋出一個錯誤:檢查在Django中的圖像文件的問題

ValueError: The 'org_logo' attribute has no file associated with it. 

導致錯誤的代碼片段是:

user = request.user 
org = user.organisation 
if not checkLogoFile(org): 
    org.org_logo = '' 
    org.save() 

功能checkLogoFile看起來是這樣的:

def checkLogoFile(org): 
from os.path import exists 
path = org.org_logo.path 
if path: 
    file_name = path.split('/')[-1] 
    return exists(settings.MEDIA_ROOT+'logo/'+file_name) 
return False 

我理解它的方式如果checkLogoFile返回false,那麼org_logo值將是一個零長度的字符串。如果org_logo包含路徑,則返回該路徑。如上所述,當圖像標識是而不是存在但當其中一個存在時工作失敗。 : -/

任何指針都會非常有幫助,因爲我搜索了Google,至今沒有任何地方。

+0

在checkLogoFile中,請嘗試檢查org.org_logo:在設置路徑之前。 checkLogoFile代碼只是檢查文件是否在服務器上,而不是它在表中,因此它仍然嘗試使用org.org_logo.path。 – JamesO 2011-04-20 14:27:11

+0

這個伎倆!謝謝你的提示。當你想到它時很簡單。我在想,org_logo是從數據庫中以空字符串的形式提取的,但是基於此,它似乎沒有被創建或等於false? – Crispy 2011-04-20 14:37:02

回答

3

解決了這個問題:

def checkLogoFile(org): 
    from os.path import exists 
    path = org.org_logo.path if org.org_logo else None 
    if path: 
     file_name = path.split('/')[-1] 
     return exists(settings.MEDIA_ROOT+'logo/'+file_name) 
    return False 

但無論如何,我真的不明白爲什麼這種複雜檢查這種方式。爲什麼不只是

def checkLogoFile(org): 
    from os.path import exists 
    path = org.org_logo.path if org.org_logo else None 
    return path and exists(path) 
+0

一切都很好,我對Django和Python都很陌生,並且繼承了這段代碼,所以隨着時間的推移,我會嘗試清理一些東西。感謝這些例子。 – Crispy 2011-04-20 14:46:03

+0

如果後端存儲不是本地文件系統,該怎麼辦?是否有某種方式可以向FileField本身詢問它指向的內容是否存在? – 2012-01-25 12:13:18