2013-05-20 20 views
74

我目前正在將我項目中的所有靜態文件引用遷移到django 1.5引入的新的{%static%}標籤,但我遇到了問題,我使用變量來獲取內容的地方。有了我不能的新標籤,有什麼方法可以解決這個問題嗎?django 1.5 - 如何在靜態標籤中使用變量

當前代碼:

<img src="{{ STATIC_URL }}/assets/flags/{{ request.LANGUAGE_CODE }}.gif" alt="{% trans 'Language' %}" title="{% trans 'Language' %}" /> 

它應該是什麼(這不起作用):

<img src="{% static 'assets/flags/{{ request.LANGUAGE_CODE }}.gif' %}" alt="{% trans 'Language' %}" title="{% trans 'Language' %}" /> 

回答

104

你應該能夠與add template filter連接字符串:

{% with 'assets/flags/'|add:request.LANGUAGE_CODE|add:'.gif' as image_static %} 
    {% static image_static %} 
{% endwith %} 

您試圖執行的操作不適用於static模板標記,因爲它需要字符串或只有一個變量:

{% static "myapp/css/base.css" %} 
{% static variable_with_path %} 
{% static "myapp/css/base.css" as admin_base_css %} 
{% static variable_with_path as varname %} 
+2

我剛剛測試過它,它也不起作用。似乎我必須考慮解決這個問題 –

+1

你可以更具體地稱爲「它不工作」?剛剛測試過並輸出'/ static/assets/flags/de.gif'沒有任何問題... –

+0

我的錯!我沒有加載靜態標籤,這個解決方案工作完美:) –

10

我這用一個空字符串爲靜態路徑,然後使用自己的部分我的變量,像這樣的工作:

<a href= "{% static "" %}{{obj.a}}/{{obj.b}}/{{obj.c}}.gz" >Name</a> 
+1

這是超級聰明,但@horbor說,你可以更簡化它!https://docs.djangoproject.com/en/1.6/ref/templates/builtins/#std:templatetag-get_static_prefix – daviddeath

10

@rounin ,您至少可以使用

{% get_static_prefix %} 

當您{%load static%}時將會加載它。這只是更自然然後{%static''%} :)

+0

真棒,我下次嘗試。 – rounin

+0

這不適用於像ManifestStaticfilesStorage那樣將'foo.js'更改爲'foo.8c9a23d.js'的東西 – Kos

17

一個更簡潔的方法是將{%static%}設置爲一個從html開始的變量,以便我們可以以任何我們想要的方式使用它。

{% load static %} 
{% static "" as baseUrl %} 
<img src="{{ baseUrl }}/img/{{p.id}}"></img> 
+2

如果您將s3存儲與帶簽名的URL一起使用,則存儲後端如果未被調用以準備URL每個文件。 – shuckc

+1

這在模板中看起來很不錯,但這比使用靜態的乾淨方式更像是一種黑客。 – Mikuz