2010-01-08 12 views
7

키로 정렬 된 사전을 인쇄하고 싶습니다. 키를 정렬하는 것은 목록에 키를 넣은 다음 목록을 정렬하기 만하면보기에서 쉽습니다. 템플릿의 키를 반복하고 사전에서 값을 가져 오는 방법은 무엇입니까? 장고 | 템플릿에 dict 정렬

{% for company in companies %} 
    {% for employee, dependents in company_dict.company.items %} 
    {% endfor %} 
{% endfor %} 

는 "company_dict.company.items"일부 작동하지 않는 부분 (그냥 예 ...를 만든). 나는 회사의 가치가되기 위해 "회사"가 필요합니다. 지금 prat 회사는 위의 루프에서 "회사"의 가치가 아닌 "회사"라는 이름의 키를 찾고 있습니다.

사전 사전을 함께 처리하기 위해 약간의 작업을하고 있습니다. 데이터 레이아웃 변경은 실제로 옵션이 아닙니다. 올바른 접근 방식은 템플릿 태그를 작성하는 것인데, 내가 놓친 내장 방식이 있는지 알고 싶었습니다.

+4

왜보기에서이 작업을 수행하지 않으십니까? –

+0

처리 작업이 많습니다. 템플릿에서 아무 것도하지 않아도되도록 설정하면 데이터에서 두 번째 패스가 발생합니다. 나는 그저 할 수있을 것 같아 ... 그대로 둘 수 있다면 더 좋을 것 같아. – johannix

답변

2

이 시도 : http://www.bhphp.com/blog4.php/2009/08/17/django-templates-and-dictionaries

사용자 지정 서식 필터 트릭을 할 것입니다. 사용자 정의 템플릿 필터에

from django import template 
register = template.Library() 

def dict_get(value, arg): 
    #custom template tag used like so: 
    #{{dictionary|dict_get:var}} 
    #where dictionary is duh a dictionary and var is a variable representing 
    #one of it's keys 

    return value[arg] 

register.filter('dict_get',dict_get) 

더 : 당신은 당신의 예에서 http://docs.djangoproject.com/en/dev/howto/custom-template-tags/#howto-custom-template-tags

을 할 거라고 :

from django import template 
from django.utils.datastructures import SortedDict 

register = template.Library() 

@register.filter(name='sort') 
def listsort(value): 
    if isinstance(value, dict): 
     new_dict = SortedDict() 
     key_list = sorted(value.keys()) 
     for key in key_list: 
      new_dict[key] = value[key] 
     return new_dict 
    elif isinstance(value, list): 
     return sorted(value) 
    else: 
     return value 
    listsort.is_safe = True 

:

{% for employee, dependents in company_dict|company %} 
+2

고마워요! 네가 한 짓을 수정해야했다. 내 필터는 "value [arg] .iteritems()"를 반환하고 템플릿은 다음과 같이 보입니다. {employee %, company_dict | get_dict_and_iter : company %} – johannix

+0

어쨌든 작동합니다. 이 사이트를 사용하는 대부분의 사람들은 내가했던 일을 수정할 수 있습니다. –

19

이처럼 사용자 정의 필터를 생성 템플릿에서 다음을 사용하여 호출하십시오 :

{% for key, value in companies.items|sort %} 
     {{ key }} {{ value }} 
{% endfor %} 

키를 사용하여 정렬 된 dict를 가져올 수 있습니다.

+1

어쩌면 거의 정확한 복제본이지만 다른 하나는 그렇지 않았지만이 대답은 나를 도왔고 아빠 잇몸이 훌륭했습니다. 정말 고마워요! – mVChr

+0

그것은 이전 답변보다 더 많은 도움이되었습니다! – Mibou

+0

* "is_safe 필터를 표시하면 필터의 반환 값이 문자열로 강제 변환됩니다. 필터가 부울 또는 기타 문자열이 아닌 값을 반환해야하는 경우 is_safe를 표시하면 의도하지 않은 결과가 발생합니다 (예 : 부울 False를 문자열 ' False '). "* ([django documentation] (https://docs.djangoproject.com/ko/1.6/howto/custom-template-tags/#filters-and-auto-escaping)) 그래서 아마도 더 좋습니다 is_safe 행을 제거하십시오. –

1

이 마지막 솔루션은 나에게도 매우 유용했습니다. 나는 장고 1.6.2를 사용하고 있는데, 목록의 첫 번째 항목과 두 번째 항목의 내용을 키로하여 목록으로 변환하는 것으로 보인다. 그래서 내가 dict을 통과 할 때조차도 그것을리스트로 취급합니다. 그래서 다음과 같이하는 것이 위의 불통, 그것은 나를 위해 작동 : Turikumwe의 필터 나 (python3.4, 장고 1.7)에 근무하지 일부 reasone에 대한

@register.filter(name='sort') 
def listsort(value): 
    if isinstance(value, list): 
     return sorted(value, key=lambda k:k[0]) 
    else: 
     return value 
0

를, 그래서 튜플의 목록을 반환하도록 다시 작성 대신 SertedDict 또는 OrderedDict의 :

@register.filter(name='sort') 
def listsort(value): 
    if isinstance(value, dict): 
     a = [] 
     key_list = sorted(value.keys()) 
     for key in key_list: 
      a.append((key, value[key])) 
     return a 
    elif isinstance(value, list): 
     return sorted(value) 
    else: 
     return value 

listsort.is_safe = True 

그래서 템플릿에 우리는 .items Turikumwe의 대답은 나를 사랑 받고

{% for key, value in companies|sort %} 
     {{ key }} {{ value }} 
{% endfor %} 
0

, BU를 얻을 필요가 없습니다 내 환경에서는 작동하지 않았다 : python3과 Django 1.10.

{% for key, value in companies.items|sort %} 
     {{ key }} {{ value }} 
{% endfor %} 

실제로 ItemsView 객체가 아닌 DICT 결과 :

내가 가진 필터를 호출하는 것으로 나타났다. (이 python 2 대 3 문제가 용의자). ItemsView가 주어지면 대답은 더욱 쉬워집니다.

from django import template 
from django.utils.datastructures import ItemsView 

register = template.Library() 

@register.filter(name='sort') 
def listsort(value): 
    if isinstance(value, ItemsView) or isinstance(value, list): 
     return sorted(value) 
    else: 
     return value