2011-09-14 180 views
2

在我的網站上,用戶可以上傳他們自己的配置文件圖片,我通過擴展核心User模型的UserProfile模型中的ImageField進行管理。以下是UserProfile模型的簡化版本:Django:在ImageField中存儲相對和絕對圖像路徑

class UserProfile(models.Model): 
    picture = models.ImageField(upload_to='img', blank=True, null=True) 
    profile_picture = models.ImageField(upload_to='img', default='img/profile/default_profile.png', blank=True, null=True) 
    user = models.ForeignKey(User, unique=True) 

我使用PIL創建上傳圖像的縮略圖版本。

要顯示模板中的個人資料圖片,我使用的文檔推薦url功能如下:

{{ user.get_profile.profile_picture.url }} 

我負責的是當用戶帳戶連接到Facebook的問題,並希望在我的網站上使用他們的Facebook個人資料圖片作爲他們的個人資料圖片。

取決於用戶指定的設置,處理顯示用戶上傳的圖像或他們的Facebook個人資料圖片的最佳方式是什麼?

如果我在profile_picture字段中存儲了Facebook個人資料圖片的路徑,我將不得不在顯示網站上的每個個人資料圖片之前進行檢查,否則我會將我的MEDIA_ROOT/MEDIA_URL預先登錄到圖片:

/media/https://graph.facebook.com/[fbid]/picture 

我的另一種選擇是,只要將圖像上傳到MEDIA_ROOT/MEDIA_URL添加到profile_picture領域。不幸的是,唯一的方法是在我的views.py中使用add_profile_picture函數,這是因爲Django默認將圖像路徑存儲爲沒有開始正斜槓的圖像,並且因爲如果您嘗試打開相對路徑開頭的圖像一個正斜槓。但是,如果我預先準備好完整的圖像路徑,則不必在我的模板中使用url函數,並且我可以按如下所示顯示圖像,無論它是上傳的圖像還是Facebook圖像,它都能正常工作:

{{ user.get_profile.profile_picture }} 

然而,這兩個選項都像黑客,我覺得必須有一個更有效的方法來做到這一點,所以我現在轉向SO尋求最佳實踐的靈感/指導。

在此先感謝您的幫助。

回答

1

幾種可能性:

  1. 上寫,重寫save()和寫入到數據庫之前按摩給定值到所期望的值,或者在讀
  2. ,創建其檢查所存儲的值的方法並按照適當的模式進行按摩。應用@property裝飾讓您可以從模板直接訪問它

我想補充一點,在沿着這些線路(相同,但不同)我自己的戰鬥中,我拋棄了的ImageField完全贊成CharField的,讓程序以上處理獨特的成像細節(例如:縮略圖)。

+0

+1謝謝,結束了與選項1類似的東西。 –