2010-03-07 2 views
0

테이블에 항목을 넣을 템플릿을 만들려고합니다.장고 : 배열 인덱스로 변수를 사용하고 계십니까?

컨트롤러 :

items = Item.all().order('name').fetch(10) 

    template_values = {'items': items, 
         'headers': ['Name', 'Price', 'Quantity']} 
    render('Views/table.html', self, template_values) 

템플릿 :

<table> 
    <tr> 
    {% for header in headers %} 
     <th>{{header}}</th> 
    {% endfor %} 
    </tr> 
    {% for item in items %} 
     <tr><td><a href="detail/{{item.CSIN}}">{{item.name}}</a></td><td>{{item.CSIN}}</td></tr> 
    {% endfor %} 
</table> 

지금, 템플릿 하드 item의 특정 속성을 찾기 위해 코딩된다. 이를 변경하여 이름이 headers 인 속성을 찾거나 첫 번째 n 속성을 찾습니다 (여기서 n은 headers의 길이 임).

어떻게하면됩니까?

+2

흠, 왜 템플릿 논리 (표시 할 열)를보기에 넣으시겠습니까? –

+0

왜 표시 할 열을'hea 데르 '입니다. 이렇게하면 템플리트를 재사용 할 수 있습니다. 표시 할 열의 선택은 컨트롤러에서 이루어지며 컨트롤러는'header' 값을 통해 템플릿을 알려줍니다. –

답변

2

당신은 할 뷰를 조정할 수 :

items = Item.all().order('name').fetch(10) 
headers = ['Name', 'Price', 'Quantity'] 
viewitems = [[getattr(x, h) for h in headers] for x in items] 

template_values = {'items': viewitems, 
        'headers': headers} 
render('Views/table.html', self, template_values) 

그래서 모든 템플릿은 상관이 단지 헤더에 해당하는 표시하기 위해 값 목록을 사용하면 각각 "항목"(이상 루프입니다. 기본적으로 이것은 뷰에서 보이는 파이썬 코드로 템플릿 (또는 무엇을 보여줄지 결정)을 전체적으로 (또는 실제로 템플릿과 뷰에서 각각 조금씩) 나누어 템플릿을 단순화하고 더 일반적으로 만들고 싶습니다.

+0

아마도 db 쿼리 일 수 있으므로 뷰 항목을 느리게 평가할 수 있습니까? –

+0

예, 꽤 괜찮습니다.'viewitems'의 외부 레벨에 listcomp (대괄호) 대신 genexp (둥근 괄호)를 사용할 수 있습니다. 그러나 'fetch (10)'(OP의 질문에 이미 포함되어 있음)로는 시간 절약이 적어야합니다 (10 개 DB 쿼리 대 하나의 10 개 항목 쿼리 ...). –

1

원하는 것을 성취 할 수있는 기존 템플릿 태그/필터가 있는지 확실하지 않습니다. 항목 목록과 현재 머리글을 받아들이고 조회 후 값을 반환하는 사용자 지정 서식 파일 태그 나 필터를 작성할 수 있습니다. http://docs.djangoproject.com/en/dev/howto/custom-template-tags/을보십시오.

관련 문제