2010-07-06 8 views
2

장고 템플릿에 표시 할 값 목록이 있습니다.Django : 템플릿에 변수를 만듭니다.

목록은 다소이 같다 : 첫 번째 열은 형태 YYYYMM의 날짜이며, 두 번째는

목록 날짜 내림차순

으로 정렬되는 일반적인 문자열

199801 string1 
199802 string2 
199904 string3 
200003 string4 
200011 string5 

1998 string1, string2 
1999 string3 
2000 string4, string5 
,536 :

은 내가 만들려고하는 것은 일이 같은 올해로 그룹화 stringx의 목록입니다

나는 문서에 모습을 포기하고 내가해야 할 유일한 것은 내가 인쇄 된 "작년에"저장하는 변수를 만들 수있는 방법이라고 생각, 그래서 나는 같은 것을 수행 할 수 있습니다

if current_value.year != last_year 
    #create a new row with the new year and the string 
else 
    #append the current string to the previous one 

을 내가 찾은 유일한 방법은 사용자 정의 templatetag을 작성하고 변수와 값을 저장하도록하는 것입니다. 그러나 코드를 작성하기 전에 간단한 방법이 있는지 알고 싶습니다.

+3

당신이보기에서 수행해야합니다. Django doc : * 템플릿 시스템은 프로그램 로직이 아닌 프리젠 테이션을 표현하기위한 것입니다. * – mykhal

답변

5

항상보기에서 그런 작업을 수행하기 위해 템플릿 시스템은 이러한 작업을 위해 설계되지 않았습니다. 또한, 이것을 달성하는 것이 훨씬 더 어려울 것입니다. 내 생각에 가장 좋은 아이디어는 필터를 만드는 것입니다. 그러나 이것은 단지 하나의 용도로만 매우 특정한 필터를 만들 것입니다. 그것은보기에 매우 달성하기 쉽다 :

last = None 
result = [] 
for year, value in tuples: 
    if year[0:4] == last: 
     result[-1].append(value) 
    else: 
     result.append([value]) 
     last = year[0:4] 
2

사용 itertools는 GROUPBY

l = [ 
    (199801, 'string1'), 
    (199802, 'string2'), 
    (199904, 'string3'), 
    (200003, 'string4'), 
    (200011, 'string5'), 
] 

from itertools import groupby 
iterator = groupby(l, key=lambda item: str(item[0])[:4]) 

for year, str_list in iterator: 
    print year, list(str_list) 

당신은 디자인에 의해, 뷰에서 변수를 만들 수 없습니다

1998 [(199801, 'string1'), (199802, 'string2')] 
1999 [(199904, 'string3')] 
2000 [(200003, 'string4'), (200011, 'string5')] 
+0

와우,이 groupby iterator는 훌륭합니다 :-) – gruszczy

0

출력.

ifchanged 태그는 아마 당신이 원하는 것을 그러나 :

{% for val in values %} 
    {% ifchanged val.0 %} {{val.0}} {% endifchanged %} 
    {{ val.1 }} 
{% endfor %} 
관련 문제