2009-07-28 2 views
5

개체를 템플릿에 전달하기 전에 복잡한 정렬을 어떻게 수행 할 수 있습니까? 예를 들어, 내 시야는 다음과 같습니다.Django 템플릿의 목록을 정렬 및 인덱싱 하시겠습니까?

@login_required 
def overview(request): 
    physicians = PhysicianGroup.objects.get(pk=physician_group).physicians 

for physician in physicians.all(): 
    physician.service_patients.order_by('bed__room__unit', 'bed__room__order', 'bed__order') 

return render_to_response('hospitalists/overview.html', RequestContext(request, {'physicians': physicians,})) 

의사 개체가 템플릿에서 올바르게 정렬되지 않았습니다. 왜 안돼?

또한 템플릿의 목록에 어떻게 색인을 생성합니까? 예를 들어, (이 작동하지 않음) :

{% for note_type in note_types %} 
    <div><h3>{{ note_type }}</h3> 
    {% for notes in note_sets.index(parent.forloop.counter0) %} 
    #only want to display the notes of this note_type! 
     {% for note in notes %} 
     <p>{{ note }}</p> 
     {% endfor %} 
    {% endfor %} 
    </div> 
{% endfor %} 

감사 잔뜩 피트

+0

@ 피터 모텐슨, 왜 당신이 주변 사람들의 게시물에서 감사를 제거 가야합니까? 이 질문의 개정판 # 8을보십시오. 나는 이것을 받아 들일 수 없다. – slypete

답변

11

다른 사람들이 지적했듯이 두 가지 문제는 모델 외부 또는보기에서 가장 잘 해결됩니다. 하나의 전략은 관련 클래스에 도우미 메서드를 추가하는 것입니다.

class Physician(Model): 
    ... 
    def sorted_patients(self): 
     return self.patients.order_by('bed__room__unit', 
            'bed__room__order', 
            'bed__order') 

그리고 템플릿

physician.sorted_patients보다는 physician.patients 사용

의사의 환자의 정렬 된 목록을 가져 오기.

"이 note_type의 메모 표시"에 대해서는 notes 메서드가 note_type 클래스에 대해 필요한 것처럼 들릴 수 있습니다.

class NoteType: 
    ... 
    def notes(self): 
     return <calculate note set> 

그리고 템플릿 :이 그 일을하는 한 가지 방법은

{% for note_type in note_types %} 
    <div><h3>{{ note_type }}</h3></div> 
    {% for note in note_type.notes %} 
     <p>{{ note }}</p> 
    {% endfor %} 
    </div> 
{% endfor %} 
+0

감사합니다. 거의 아무것도 템플릿에서 수행 할 수 없다는 사실에 대해 머리를 터는 것이 조금 어렵습니다!목록에 색인을 생성하지 않습니다. – slypete

+0

최근 버전의 django에서는 목록에 색인을 생성 할 수 있습니다. –

4

를 "나는 템플릿 내에서이 작업을 수행하고 싶습니다 :"

하지 마십시오 . 그것이 속한 뷰 기능에서 수행하십시오.

질문이 불완전하기 때문에 데이터 모델을 추측하고 정확한 해결책을 제시하는 것은 불가능합니다.

results= physician.patients.order_by('bed__room__unit', 'bed__room__order', 'bed__order') 

충분해야합니다. 렌더링을 위해 템플릿에 results을 입력하십시오. 그것은 올바른 순서에 있습니다.

제대로 분류되지 않은 경우 (아마도 일부 모델이 미묘하기 때문에) 항상 이런 종류의 대안이 있습니다.

def by_unit_room_bed(patient): 
    return patient.bed.room.unit, patient.bed.room.order, patient.bed.order 

patient_list = list(physician.patients) 
patient_list.sort(key=by_unit_room_bed) 

렌더링을위한 템플릿 patient_list을 제공합니다. 그것은 올바른 순서에 있습니다.

"어떻게 템플릿 안에 목록으로 당신에게 색인을"나는 당신이 뭘하려는 건지 잘 모르겠지만, 대부분의 시간, 대답은 "안 함"

. 보기 기능에서 수행하십시오.

템플릿은 간단한 HTML 템플릿으로 작성되는 간단한 목록을 반복합니다.

템플릿이 너무 복잡하면 그렇게 보입니다. 템플릿은 간단하게 유지하십시오. 처리는보기 기능에 간다

+0

개체를보기에 전달하기 전에 개체 내의 개체 정렬을 어떻게 제안합니까? 예를 들어 physician.service_patients = physician.service_patients.all(). order_by ('bed_room__unit', 'bed_room__order', 'bed__order') – slypete

+0

"작동하지 않는다"는 것은 무엇을 의미합니까? 그것은 무엇을 잘못합니까? –

+0

service_patients가 ForeignKey이므로 할당하면 객체를 사용할 수 없게됩니다. – slypete

1

당신은 당신의보기에서 설정 한 주문 쿼리를 생성하고 템플릿에 전달 할 수 있어야한다 :

def myview(request): 
    patients = Physician.patients.order_by('bed__room__unit', 
              'bed__room__order', 
              'bed__order') 
    return render_to_response('some_template.html', 
           dict(patients=patients), 
           mimetype='text/html') 

귀하의 템플릿을 다음 patients 돌이는 주문 포함 할 수 있습니다 결과. 이 방법이 효과가 없습니까?

EDIT : 색인 생성을 위해 도트 구문을 사용하십시오. mylist.3은 템플릿에 mylist[3]의 비단뱀이됩니다. 자세한 내용은 http://docs.djangoproject.com/en/dev/ref/templates/api/#rendering-a-context을 참조하십시오.

+0

아니요, 템플릿에 설정된 의사를 전달한 이후로 아닙니다. 템플릿으로 전달하기 전에 의사가 설정 한 각 의사의 환자를 정렬 할 수 있습니까? – slypete

+0

나는 의사 세트와 주문받은 환자 세트 목록을 전달할 수 있다고 생각하지만, 그것이 옳은 것 같지 않다 ... 내가 무슨 뜻인지 안다면. 나는 오히려 단지 하나의 세트를 전달하고 나는 그것을하는 방법을 모른다. – slypete

+0

나는 의사가 모델이고 환자가 모델 매니저라고 생각했습니다. 의사에게 인스턴스 메소드를 만들 수 있다고 생각합니다. get_patients는 주문한 환자의 쿼리 세트를 반환합니다. 템플리트에서이를 호출하고 결과 세트를 반복 할 수 있어야합니다. – ars

0

인이 모델 클래스인지,하지만 원칙은 동일 할 경우 당신의 묘사에서 나는 확실하지 않다 매우 추한 있지만 :

{% for note in note_sets|slice:"forloop.counter0"|first %}

+0

죄송합니다. 이것은 작동하지 않습니다. 방금 해봤 어. –

+0

권자, 이것은 괴롭습니다. – slypete

관련 문제