2010-01-14 70 views
25

我的視圖代碼基本上是這樣的:在Django模板中通過變量訪問字典?

context = Context() 
context['my_dict'] = {'a': 4, 'b': 8, 'c': 15, 'd': 16, 'e': 23, 'f': 42 } 
context['my_list'] = ['d', 'f', 'e', 'b', 'c', 'a'] 

什麼,我想在我的Django的模板做的是這樣的:

<ul> 
{% for item in my_list %} 
    <li>{{ item }} : {{ my_dict.item }}</li> 
{% endfor %} 
</ul> 

,我想這是輸出:

<ul> 
    <li> d : 16 </li> 
    <li> f : 42 </li> 
    <li> e : 23 </li> 
    <li> b : 8 </li> 
    <li> c : 15 </li> 
    <li> a : 4 </li> 
</ul> 

但是,通過{{ my_dict.item }}通過變量名稱引用字典實際上並不起作用。我懷疑它是在內部做my_dict['item']而不是my_dict[item]。有什麼辦法可以解決這個問題嗎?

+0

當然,我總是可以在視圖中說,添加更多的代碼:背景[ 'my_derefernced'] = [(V,上下文[my_dict] [V])爲以V context ['my_list']]但我寧願不必這樣做。這些指令可能相當大。 – slacy 2010-01-14 19:50:05

+0

看看這個偉大的解決方案:http://stackoverflow.com/questions/35948/django-templates-and-variable-attributes – fiatjaf 2012-01-01 15:26:24

+0

如果字跡很大,爲什麼不使用生成器?可能是這樣的:'context ['my_dereferenced'] =((v,context [my_dict] [v])for context ['my_list'])' – user193130 2015-03-20 17:25:52

回答

15

有做,沒有內建的方法,你需要編寫一個簡單的模板過濾器來做到這一點:http://code.djangoproject.com/ticket/3371

+0

Thanks Alex。我知道我可以寫一個模板過濾器。爲什麼不修改模板處理器以包含{{foo.bar}}嘗試foo.resolve_variable(bar,context)和foo [resolve_variable(bar,context)]的步驟? – slacy 2010-01-14 19:56:35

+5

寫出{{my_dict | access:item}} – slacy 2010-01-14 19:57:22

+2

@slacy好像很愚蠢如果你覺得不自然和笨拙,你可以考慮檢查Jinja。它比Python的內置模板系統更有點Pythonic,並且沒有多少意見。並非所有人都同意,但我個人更喜歡它。 – 2011-01-11 19:00:26

5

這裏的建議答案的使用情況。

在這個例子中,我創建了一個通用模板,用於從視圖中輸出表格數據。有關列的元數據保存在上下文[「columnMeta」]中。

既然這是一本字典,我不能依賴按鍵來按順序輸出列,所以我有一個單獨的列表中的鍵爲此。

在我view.py:


c["columns"] = ["full_name","age"] 
c["columnMeta"] = {"age":{},"full_name":{"label":"name"}} 

在我templatetags文件:


@register.filter 
def getitem (item, string): 
    return item.get(string,'') 

在我的模板:

 
<tr> 
<!-- iterate columns in order specified --> 
{% for key in columns %} 
<th> 
<span class="column-title"> 
    <!-- look label in meta dict. If not found, use the column key --> 
    {{columnMeta|getitem:key|getitem:"label"|default:key}} 
    </span> 
</th> 
{% endfor %}</tr> 
2

爲了我的需要,我想要一個適用於字典,列表和元組的模板過濾器。所以,這裏是我使用的:

@register.filter 
def get_item(container, key): 
    if type(container) is dict: 
     return container.get(key) 
    elif type(container) in (list, tuple): 
     return container[key] if len(container) > key else None 
    return None 
相關問題