2012-12-12 54 views
0

我有一個Python對象,它是容器子類的一個實例。因此,該對象x的行爲可能與x['name']相似。這個對象也有方法,說x.bar()從Django模板訪問容器的方法

如何從Django模板中調用x.bar?首先將模板x.bar評估爲x['bar'],這會給出None

我能想到的最好的方法是創建一個對象陰影x,即沒有getitem。但我不能delattr__getitem__

有什麼更好的點子?在上下文或模板標籤中手動傳遞這些調用的結果的缺點。

謝謝。

+0

我想我可以創建一個代理類並使用__getattr__來調用對象中的方法。 – Overclocked

回答

1

這是Django模板進行表達式評估的基本缺陷。查看模板標籤{% expr -arbitrary-python-expression- %}以獲得解決方法。例如。 {% expr x.bar(1,2,3) as snort %}在當前上下文中爲您提供了一個名爲snort的新變量。

或者,您可以嘗試Jinja2模板。他們非常接近Django的,但他們允許完整的Python。

注意:Jinja2是而不是與Django的模板系統相同,如果您使用的是任何依賴於模板系統的嵌入頁面的django應用程序,這可能會打破它們。對於{% expr %}標籤,這不是真的。

+0

我不是模板中泛型python表達式的粉絲,但我明白你的意思。這可能是唯一的選擇。 – Overclocked

+0

@超頻:我們非常保守地使用'expr';大部分在緩存大*格式數據的模板區域。如果緩存已過期(信息在視圖中不可用),那麼我們會使數據獲取發生在模板內部。這爲我們解決了重大的性能問題。我們試圖通過一個curried函數,但這個錯誤多年來一直沒有解決;最後修復爲1.3([#7153](https://code.djangoproject.com/ticket/7153))。 –