1

我明白,我們可以使用模板兩個不同的擴展模板之間切換「延伸變量」。 例如Django的擴展不同的基本模板

views: 
    if something: 
     base = 'base1.html' 
    else: 
     base = 'base2.html' 
    return render_to_response ('template.html', {'base':base}) 

    template.html: 
    {% extends base %} 

通常情況下,工作正常。但是,我的問題是,我使用的是django註冊,我不必編寫自己的視圖來處理註冊和登錄過程。這也意味着我無法將變量傳遞給模板。雖然我的項目目錄下有註冊模板。 (喜歡的login.html)

不幸的是,Django的不能在模板中做到這一點:

{% if something %} 
    {% extends 'base1.html' %} 
    {% else %} 
    {% extends 'base2.html' %} 
    {% endif %} 

我知道了「可變基數」可以向下傳遞到身份驗證登錄的唯一方法是寫我自己的意見,如登錄,註銷等。這似乎不適合DRY模型,並且相當容易出錯。

有沒有辦法,我能做到這一點的另一種方式?或者解決問題的任何指針?

謝謝。

-P

回答

4

說實話這在我看來就像一個代碼味道 - 我使用的Django註冊了幾次,我的工作相當大的網站,我從來不需要從其他模板,僅在運行稱爲擴展模板時間。

無論如何,如果你真的想自定義變量傳遞到由第三方模塊呈現模板,你不要想破解這個模塊,那麼你必須使用例如定製template context processor。此外,django註冊允許extra_context傳遞給它的意見,也許這就夠了。你也可以嘗試猴子補丁。或者,也許你可以嘗試操縱模板文件夾或模板加載器來獲得你所需要的。

但是,所有這些東西都是黑客恕我直言,你不應該爲一個視圖中使用不同的模板,除非它是一個通用視圖。

+1

Tomasz,你是正確的,這是更多的編碼問題。發佈這個問題後,我挖了一點。我需要切換基本模板的原因是我有兩個不同版本的網站 - 完整版和移動版。由於超過1/2的網站將永遠不會移動到移動網站,因此我開始使用中間件來切換視圖。要真正解決我的問題,我相信我將不得不添加方法來重新路由我的移動GET請求。我只是因爲懶惰才希望避免這種情況。感謝帖子!感謝您的時間。 – pdxMobile 2011-02-26 18:34:21

1

這可能不是你在找什麼,但你可以只包括你的條件語句中的base.html文件?

+0

你應該把這種東西的評論,而不是作爲答覆.. – bx2 2011-02-26 12:35:07

+0

只有1聲望,我無法創建評論。我會牢記這一點。謝謝。 – DTing 2011-03-03 04:26:31

1

我想你不應該把模板之間的差異爲不同的基本模板的選擇。擁有不同的基本模板違反了DRY原則。將常見的東西放在模板中,即。 registration.html,您通過撥打差異考慮其他模板「包括」:

{%extends base.html%} 

{%if something%} 
    {%include "type1.html"%} 
{%else%} 
    {%include "type2.hmtl"%} 

在模板名稱是一樣的,你會在視圖定義中使用。

3

如果只是2(或3)該 '東西' 可以爲布爾做出選擇,那麼你可以使用YESNO過濾器: https://docs.djangoproject.com/en/dev/ref/templates/builtins/#yesno

所以:

{% extends something|yesno:"base1.html,base2.html" %} 

如果您想要的東西多一點自由形式,那麼你可以利用上面提到的額外的上下文/自定義的背景處理器選項,並嘗試類似:

{% extends selected_template|default:"base2.html" %} 

選擇的模板只是您喜歡的任何基礎模板的路徑。