2014-12-30 92 views
0

我的所有用戶都可以選擇鏈接配置文件圖片。有幾個模板需要加載此配置文件圖片。如果用戶沒有上傳圖片,我們使用默認值。當我想顯示此資料圖片,我的代碼看起來像這樣解析服務器上的靜態URL

<img src="{% if user.profile_picture.search_thumbnail.url %}{{ user.profile_picture.search_thumbnail.url }}{% else %}{% static "alternate.jpg" %}{% endif %}"> 

這是辦法,我太冗長,特別是考慮到我需要重複它在多個模板。我可以使用{%with%}塊來存儲user.profile_picture.search_thumbnail.url,但這對我來說無能爲力。

我的解決方案是編寫一個附加到用戶模型的函數,該函數返回靜態文件的url。不幸的是,{%static%}是一個模板函數。 {%url%}在服務器上有一個名爲django.core.urlresolvers.reverse()的等效函數。 {%static%}標記是否存在替代方法?

如果有人問,我想使用靜態函數,因爲我的靜態文件根據環境存儲在不同的地方。我的開發機器在本地提供文件,而我的PRD機器從s3提供靜態文件。

謝謝 尼克

+1

''settings.STATIC_URL''? –

+0

這是一個非常合理的建議 – Nick

回答

1

爲什麼不寫一個過濾器,你可以做到這一點。

<img src="{{ user.profile_picture.search_thumbnail.url|custom_filter }}">

,並在您從settings.STATIC_URL讀返回正確的網址,用戶一個未設置custom_filter。

你可以使過濾器更短這樣

<img src="{{ user|user_pic_url }}">

,並在過濾器中拔出.profile_picture.search_thumbnail.url /檢查

+0

使用過濾器有沒有什麼優點/缺點,而只是向我的用戶模型中添加一個方法,以便爲我返回url? – Nick

+0

沒有我能想到的;除非你需要傳遞額外的論據,否則我認爲兩者都可以很好地工作。 –

+0

聽起來對我很好。謝謝 – Nick

0

這是static templatetag做什麼的下方,你可以在你自己的代碼中使用它:

from django.contrib.staticfiles.storage import staticfiles_storage 

def static(path): 
    return staticfiles_storage.url(path)