2010-01-14 2 views
25

내보기 코드는 다음과 기본적으로 같습니다Django 템플릿에서 변수를 사용하여 dict에 액세스하고 있습니까?

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'] 

그리고 내가 내 장고 템플릿에서 할 싶은 것은 이것이다 :

<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에 대한 컨텍스트 [ 'my_list']]하지만 그렇게하지 않아도됩니다. 그 딕트는 꽤 클 수 있습니다. – slacy

+0

이 훌륭한 해결책을보십시오 : http://stackoverflow.com/questions/35948/django-templates-and-variable-attributes – fiatjaf

+0

dicts가 큰 경우 왜 발전기를 사용하지 않습니까? context : 'my_dereferenced'] = ((컨텍스트 [my_list]] 컨텍스트에서 v의 컨텍스트 [my_dict] [v]) ' – user193130

답변

15

그렇게 할 내장 방법은 없습니다, 당신은이 작업을 수행 할 수있는 간단한 템플릿 필터를 작성해야합니다 것 : http://code.djangoproject.com/ticket/3371

+0

감사합니다. 템플릿 필터를 작성할 수 있다는 것을 알고있었습니다. 템플릿 프로세서를 수정하여 {{foo.bar}}가 foo.resolve_variable (bar, context) 및 foo [resolve_variable (bar, context)]를 시도하는 단계를 포함시켜야하는 이유는 무엇입니까? – slacy

+5

{{my_dict | access : item}} – slacy

+2

@slacy를 쓰는 것은 당연한 것처럼 보입니다. 부자연스럽고 다루기 힘든 경우 Jinja를 확인해보십시오. Django에 내장 된 템플리트 시스템보다 약간 더 파이썬적이고 훨씬 덜 독창적입니다. 모두가 동의하는 것은 아니지만 개인적으로 더 좋아합니다. –

5

여기에 제안 된 대답의 사용 케이스입니다.

이 예제에서는 뷰에서 표 형식의 데이터를 출력하기위한 일반 템플릿을 만들었습니다. 컨텍스트 [ "columnMeta"]에서 열에 대한 메타 데이터가 보관됩니다.

사전이므로 사전에 열을 출력하는 데 키를 사용할 수 없으므로 이에 대한 별도의 목록에 키가 있습니다.

 
<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> 
4

의 키와 값을 표시하려면이 시도 : 내 템플릿에서


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

: 내 templatetags 파일에서


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

: 내 view.py에서

사전 :

{% for key, value in your_dict.items %} 
    {{ key }}: {{ value }} 
{% endfor %} 
내 요구를 들어 6,

https://docs.djangoproject.com/en/dev/ref/templates/builtins/#for

2

, 내가 dicts,리스트, 튜플을 위해 일하는 것이 하나의 템플릿 필터를 원했다. 그래서, 여기에 내가 무엇을 사용 : 물론

@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 
관련 문제