[英]Python/Django: Simple Django Template
嗨,我正在使用App Engine / Python來做一個簡單的網站。 我在Django模板問題上遇到了一些麻煩。
簡而言之,我想使用“ ShortName”來訪問“ LongName”。
源代碼:
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
無法正常工作。
我不知道怎么了
這試圖訪問LongName['aname']
,而不是LongName[aname]
。
您可能必須編寫一個自定義模板標簽/過濾器才能使它起作用。 此Django錯誤 (標記為WONTFIX)具有一個簡單的實現:
def get(d, key):
return d.get(key, '')
register.filter(get)
您將使用的
{{ LongName|get:aname }}
將其添加到您的應用后 (該答案將顯示如何在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的方法將使您完全不必接觸Python文件。 正如他提到的那樣,它涉及很多無意義的迭代,但對於較小的列表來說可以很好地工作。
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模板中沒有更好的方法通過變量名引用字典的條目。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.