2009-08-12 7 views
11

django의 템플릿 언어는 매우 제한적입니다. 장고의 DRY 원리와 함께 많은 다른 템플릿에서 사용하고 싶은 템플릿이 있습니다. 예를 들어 환자 목록 :django 템플릿을 재사용 하시겠습니까?

{% for physician in physicians.all %} 
     {% if physician.service_patients.count %} 
      <div id="tabs-{{ forloop.counter }}"> 
       {% include "hospitalists/patient_list.html" %} 
      </div> 
     {% endif %} 
    {% endfor %} 

문제는 patient_list 템플릿 patients라는 이름의 환자의 목록을 기대하고 있다는 것입니다. 템플릿을 포함하기 전에 physician.service_patientspatients으로 어떻게 바꿀 수 있습니까?

덕분에, 피트

답변

16

사용하여 태그와 함께 :

{% for physician in physicians.all %} 
    {% if physician.service_patients.count %} 
     {% with physician.service_patients as patients %}     
     <div id="tabs-{{ forloop.counter }}"> 
      {% include "hospitalists/patient_list.html" %} 
     </div> 
     {% endwith %} 
    {% endif %} 
{% endfor %} 

또한 사용자 정의 태그를 만들기로 업그레이드 할 수 있습니다

{% for physician in physicians.all %} 
    {% if physician.service_patients.count %} 
     {% patient-list physician.service_patients %} 
    {% endif %} 
{% endfor %} 

하지만 사용자 정의 태그를 쉽게 사용할 수 있도록 바로 가기가, 파이썬 코드를 작성 포함 기존 템플릿 파일을 태그로 사용 : Django Inclusion Tags

+0

감사합니다! 나는 계속 "as"태그를 찾고 있었다. 나는 "함께"일한다고 생각합니다. – slypete

+0

Django 1.3부터 ​​다음 스타일을 사용할 수 있습니다 :'{% include "sometemplate.html"with spam = eggs, ham = "Ham!" %}'. –

3

당신은 루프 내부의 "기능"(특별히 경우 조건)를 가지고, 당신은보기 기능으로이 이동 할 수있는 기회를 가질 수있다.

먼저

{% for physician in physicians.all %} 
    {% if physician.service_patients.count %} 
    {% endif %} 
{% endfor %} 

당신이 그것을 피할 수있는 몇 가지 방법이 너무 일반적입니다 구성.

  1. 모델을 변경하십시오. service_patients.count` 테스트의 경우 patients" method and use it instead of the default query set that you get with a on-to-many relationship. This method of your model has the을 추가하여 템플릿에서 제거하십시오.

    템플릿에서 {% if %}을 (를) 제거하여이를 {% for %} 및 실제 HTML로 줄이며 쉽게 제거 할 수 없습니다.

  2. 보기 기능을 변경하십시오. 단순한 의사 집단 대신 service_patients를 사용하여 의사 목록을 작성하려면 몇 줄의 코드를 작성하십시오. 보기 기능의이 코드는 if service_patients.count 테스트를 템플릿에서 제거합니다.

    템플릿에서 {% if %}을 (를) 제거하여이를 쉽게 제거 할 수없는 {% for %} 및 실제 HTML로 축소합니다.

요점은 {% if %}을 제거하여 {% for %}와 실제 HTML을 잘라내어 붙여 넣는 것입니다. (이는 제거 할 수없는) 단지 HTML에 템플릿을 유지함으로써, 유일한 오버 헤드는 당신이 {% include %} 약간 다른 맥락에서 구성 재사용 할 것으로 보인다

둘째 {%를 %}이다 .

{% include %} 파일의 문제점이 무엇인지 명확하지 않습니다. "patients이라는 환자 목록을 기대하고있다"는 것은 외형 적으로 어리석은 것처럼 보인다. 수정하여 physician.patients을 예상합니다.

아마도이 같은 목록을 두 번 사용하고 싶을 것입니다. 일단 'patients'이라는 목록이 있고 'physician.patients'이라는 목록이있는 목록이있는 경우 이 경우, (a) 템플리트 태그를 단순화 또는 (b) 작성하는 것을 고려하십시오.

환자 목록이 독립 실행 형 페이지 인 경우가 많고 훨씬 복잡한 페이지에서는 다른 시간이 여러 번 반복되는 것으로 보입니다. 더 긴 목록에 포함 된 세부 정보 목록을 반복하는 것이 실제로 가장 좋은 페이지 디자인은 아닙니다.장고는 이것을 도와주지 않습니다 - 솔직히 말해서 사람들이 사용하기가 쉽지 않기 때문입니다. 그러므로 옵션 (a) -이 "의사 목록 내의 환자 목록"목록을 너무 복잡하게 다시 설계하는 것을 고려하십시오.

그러나 실제로는 복잡한 태그를 만들기 위해 템플릿 태그를 쓸 수 있습니다. 장고 템플릿 언어 기능을 제한 한 이유는 정말 좋은 이유가

요약

. 모든 기능은 모델의 필수 기능이거나 모델을 사용하는 현재 응용 프로그램의 기능이어야합니다.

프리젠 테이션은 단순히 객체 (및 쿼리 세트)를 HTML로 변환하는 것입니다. 아무것도 더

+0

S.Lott,이 방법으로도 원격으로 내 템플릿에 환자 이름이 필요한 템플릿을 재사용하는 것에 대한 내 질문에 답할 수 없습니다. – slypete

+0

아직 어둠에 빠져 있기 때문에 자세히 설명해 주실 수 있습니까? – slypete

+0

S.Lott, 설명해 주셔서 감사합니다. jQuery UI의 탭 인터페이스와 결합하면 더 복잡한 컨텍스트에서 동일한 템플릿을 반복하는 것이 매우 유용합니다. with 태그는 내 질문에 대한 올바른 해결책입니다. – slypete

1

마찬가지로, 당신은 품질 템플릿 언어 jinja에서 사용하려고 할 수 있습니다. 더 유연합니다.

+0

저는 장고의 템플릿 엔진이 너무 제한적이어서 그냥 버려야한다고 믿기 시작했습니다. – slypete

관련 문제