2009-09-25 4 views
0

Django 응용 프로그램에서 모델 개체의 다중 레벨 (고정 깊이) 트리를 테이블 형식으로 표시하려고합니다. HTML 형식은 다음과 같습니다.Django 템플릿의 집계

<tr><td rowspan="2">group 1</td><td>item 1.1</td></tr> 
<tr><td>item 1.2</td></tr> 
<tr><td rowspan="3">group 2</td><td>item 2.1</td></tr> 
<tr><td>item 2.2</td></tr> 
<tr><td>item 2.3</td></tr> 

문제는 행 스파 스를 채우고 있습니다. 두 가지 레벨에 대해 충분히 쉽습니다. group.item_set.count를 사용하면됩니다. 그러나 항목 뒤에서 다른 레벨 (예 : 하위 항목 1.1.1 등)이 있다고 가정 해 봅시다. "그룹 1"셀의 행 간격은 모든 항목의 수에 모든 항목의 모든 하위 항목 합계를 더한 값이어야합니다. 집계를 사용하여 계산하기는 쉽지만 장고의 템플릿 언어에서는 집계를 사용할 수 없습니다.

  • 가 그룹 모델 클래스에 count_all_subitems 메서드를 추가합니다 몇 가지 옵션 잎
    . 그러나 뷰 계층에 필요하기 때문에 모델에 코드를 추가하는 것은 잘못되었습니다.
  • 보기 기능에서 사전 또는 하위 항목 수 목록을 생성하고 추가 컨텍스트로 전달합니다. 그러나 Django의 템플릿 언어에서는 사전/목록 조회의 키/색인이 변수가 될 수 없습니다 (예 : subitem_counts.groupsubitem_counts['group']입니다. subitem_counts[group] AFAIK). 따라서 사용자 정의 필터가 필요합니다.
  • 하위 항목 수 (또는 전체 행 스파 스 값)를 직접 계산하고 출력하는 사용자 정의 필터 또는 태그를 작성하십시오.

나는 장고가 템플릿에서 많은 논리를 피하도록 설계된 것을 알고 대신 뷰 기능에 넣을 것을 권장하지만 실제로는 추가 조각 (사용자 지정 템플릿 필터 또는 태그)이 실제로 필요합니다. 결과를 템플릿에 사용하십시오. 선호되는 접근 방식은 무엇입니까?

답변

0

보기에서 집계 "주석"메서드를 사용하여 실제 모델 정의를 수정하지 않고도 뷰에 전달되는 그룹 모델 쿼리 세트에 subitem_count 값을 추가 할 수 있습니다.

기본 예제는 this에 대한 답변에 포함되어 있습니다.

+0

실제로 3 레벨의 경우 문제가 해결됩니다. 감사! 그래도 4 개 이상의 레벨에 적용 할 수있는 방법이 있습니까? Group> Item> Subitem> Subsubitem이 있으면 Groups에 주석을 달 수 있고 Subitems에서 Subsubitems를 직접 계산할 수 있습니다. 그러나 항목은 어떻습니까? 내가 주석 querysets (각 그룹에 대한 subsubitem 카운트로 주석 달린 자사의 항목)의 어림셈을해야 할거야, 그리고 두 번째 글 머리 기호 (각 그룹과 일치하도록 사용자 정의 필터를 만들 필요가 그것의 주석이 달린 항목 qs). 아니면 제가 놓친 다른 것이 있습니까? – LaC

+0

깊은 계층 구조 (이전 주석 참조)가 있었기 때문에 결국 모델에 특별한 방법을 추가해야했습니다. 그러나 나는 많은 경우에 여전히 유용하기 때문에 쉐리의 대답을 받아들입니다. – LaC

관련 문제