5

摘要:如何引用在車把Django的模板靜態文件

我應該如何引用在Django模板一個車把部分靜態文件?如果我使用verbatim標籤,則可以使用把手,但是我無法使用django的static標籤。

詳細

雖然轉換的應用Django的,我碰到一個使用handelbars.js渲染Ajax的呼叫結果的一部分。通過,其中,「Handlebars.js in Django templates」我發現了關於{% verbatim %}標籤。

一個簡單的把手工作正常。但我也有在圖像被動態地展示了基於結果的一部分,它看起來是這樣的:

<img src="path/{{ result }}.png"> 

現在,雖然這工作正常,如果我手動設置路徑,我相信在Django這是很好的做法,引用您的靜態文件,像這樣:

<img src="{% static 'path/file.png' %}"> 

剛開不建議一個static_url不變,see for instance this blog

所以除非有人有一個真正令人信服的理由,否則解決它,我相信這是最好用{% static %}方法。

天真的解決方案是將2種技術結合起來,並逐字逐字地噴塗模板。除了這看起來醜陋,難以辨認,從一開始看起來似乎是一個壞主意,它也不起作用。

{% verbatim %} 
    <!-- handlebars --> 
    {% endverbatim %} 
    <img src="{% static 'path{% verbatim %}{{ result }}{% endverbatim %}' %}"> 
    {% verbatim %} 
    <!-- handlebars --> 
{% endverbatim %} 

這結束在流淚,作爲結果是

TemplateSyntaxError在/
無法解析的餘數: '從 '' 路徑{% '

' 路徑{%'

可能可以在後端生成正確的靜態url並進行渲染。但是後端不應該意識到我們想要在模板中顯示的圖像。

唯一的解決方案可能是使用「相對」字符串(例如path/result.png)向後端額外調用後端,並請求正確的靜態鏈接?這並不難,但需要一個額外的電話,而不是這種情況。

那麼我該如何正確引用這些靜態文件呢?

+0

反對在鏈接到的博客文章中使用「STATIC_URL」的參數似乎與您的用例無關。事實上,我會反駁,因爲你明確只需要靜態URL前綴。 URL的其餘部分(文件名部分)是由您的句柄模板在客戶端生成的。還要注意,有一個['get_static_prefix'](https://docs.djangoproject.com/en/1.9/ref/templates/builtins/#get-static-prefix)模板標籤,它爲你包裝了'STATIC_URL'。 – solarissmoke

+0

我不確定我是否同意。我想要一個來自json的圖像(名稱部分)的可變部分,並通過句柄進行分析。但是這個圖像被django用作靜態文件,所以我想讓django決定那裏會發生什麼。 沒有理由說,鏈接底部的緩存示例在我的情況下無效 - >如果我想緩存它們,那麼句柄就不知道它。所以最後,handlebars只會知道靜態文件的「相對」部分,並且據我所知,該博客中的所有參數都是相關的? – Nanne

+0

那麼爲JSON使用適當的靜態URL生成很重要?我沒有看到它對於手柄模板有什麼幫助,實際的文件路徑(這是什麼緩存/不同的存儲後端/ etc會修改)是生成的客戶端。 – solarissmoke

回答

2

你不想劃定句柄標籤和Django標籤之間的邊界。也許最乾淨的解決方案是顯式聲明車把標籤像這樣:

{{ "handlebars_variable"|handlebars }} 

其中filterhandlebars被定義爲這樣(source):

from django import template 
register = template.Library() 

@register.filter 
def handlebars(value): 
    # str.format would require ugly escaping, so we use '%' 
    return '{{%s}}' % value 

但是這還不夠:你想通過一個車把標記爲static,即使使用過濾器,您也無法直接執行此操作。但也許你可以嘗試使用with

{% with "handlebars_variable"|handlebars as handlebars_tag %} 
    <img src="{% static handlebars_tag %}"> 
{% endwith %} 

但即使這還不夠。你想要預先path/。有多種選項供您:

  • 你可以使用基於this answeradd過濾器和嵌套with語句(啊)。
  • 您可以定義一個名爲setvar的模板標籤,就像here(如果您願意)。
  • 你可以像這樣定義一個特設模板標籤(也許不雅):

    @register.filter 
    def static_result_path(value): 
        return 'result/{{%s}}' % value 
    

    ,然後模板代碼更改爲:(!最簡單的)

    <img src="{% static "handlebars_variable"|static_result_path %}"> 
    
  • 使用get_static_prefix: (並且總有Jinja)。

+0

它真的看起來不錯,但我昨天無法讓它工作。這主要是因爲調試時間很少,所以我認爲這可能是一個好的選擇! – Nanne

+0

嗯錯誤是什麼樣子? –

+0

這是大部分不同的設置問題或拼寫錯誤,至少我處理的第一個:)。我必須承認,我之間可能會有一些Nianticlabs遊戲來解決這個問題,但標記爲正確:D – Nanne

1

即使Django模板不支持任何形式的轉義字符的,他們做支持templatetag標記,使您可以嵌入在這種情況下的特殊文本。

假設你沒有太多的把手替換,你可以只是這樣做需要:

<img src="{% get_static_prefix %}path/{% templatetag openvariable %} result {% templatetag closevariable %}.png" /> 

但是,如果你有很多換人做,使用自定義過濾器按yarthathrock的答案更爲簡潔,因此從長遠來看可能更容易維護。