2012-04-28 39 views
1

嗨我正在使用App Engine/Python來做一個簡單的網站。我在Django模板問題上遇到了一些麻煩。Python/Django:簡單的Django模板

總之,我想用一個「ShortName」來訪問「LongName」。

的soource代碼:

LongName={"so":"stackoverflow","su":"superuser"} 
ShortName=['so','su'] 

然後我通過這兩個參數的模板。

在模板我寫:

{% for aname in ShortName %} 
{{ aname }} stands for {{ LongName.aname }}, 
{% endfor %} 

輸出是:給出

so stands for, su stands for 

沒有錯誤。 LongName.aname不會工作。

我不知道什麼是錯的。

+1

它在我看來像你的LongName聲明有一個不需要的和無與倫比的單引號。這實際上是在你的代碼中,還是隻是你的問題中的一個錯字? – 2012-04-28 18:06:44

+0

@亞當它是一個錯字。編輯。 – 2012-04-28 18:12:50

回答

5

這是試圖訪問LongName['aname'],不LongName[aname]

您可能必須編寫自定義模板標記/過濾器才能使其工作。 This Django bug(標WONTFIX)有一個簡單的實現:

def get(d, key): 
    return d.get(key, '') 

register.filter(get) 

,你會被

{{ LongName|get:aname }} 

adding it to your app使用後(即SO回答顯示瞭如何做它在GAE)。


你也預先做一個變量來遍歷視圖,通過傳遞

# in view 
name_abbrevs = [(k, LongName[k]) for k in ShortName] 

# in template 
{% for short_name, long_name in name_abbrevs %} 
    {{ short_name }} stands for {{ long_name }} 
{% endif %} 

如果你真的不想要添加模板標籤 - 這沒那麼糟糕!你只需製作一個文件! :)或者傳入一個額外的變量,Vic's approach可以讓你在不觸及Python文件的情況下執行此操作。正如他所提到的那樣,它涉及很多無意義的迭代,但對於小列表來說它可以正常工作。

+1

非常感謝!給源代碼添加東西的想法讓我感到害怕。我沒有搞亂源代碼的經驗。 – 2012-04-28 18:27:37

+0

你真的編輯你的答案來使用我的答案嗎?你需要找到一個更好的方式來度過你的週末。 – 2012-04-28 18:53:00

+0

@VicFryzel咦?我編輯的添加不使用你的方法(沒有嵌套循環)。我最終確實與你的答案聯繫在一起,並談論它與我建議的其他方法的關係。 – Dougal 2012-04-28 18:56:19

2

Django模板在這裏有一個缺點。我以前也遇到過這種情況。你必須做的是遍歷LongName中的所有鍵,並檢查你正在查找的鍵是否與ShortName匹配。在這裏你去:

{% for aname in ShortName %} 
    {% for short_version, long_version in LongName %} 
    {% if aname == short_version %} 
     {{ aname }} stands for {{ long_version }}, 
    {% endif %} 
    {% endfor %} 
{% endfor%} 

這是低效的,而且基本上毫無意義爲O(n^2)機制。但是,純Django模板中沒有更好的方式通過變量名來引用字典的條目。