2009-08-12 21 views
11

Uważam, że język szablonów Django jest bardzo ograniczony. Zgodnie z zasadą DRY Django, mam szablon, który chciałbym użyć w wielu innych szablonach. Na przykład lista pacjenta:Ponowne używanie szablonów django?

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

Problemem jest to, że szablon patient_list spodziewa listę pacjentów nazwanych patients. Jak zmienić nazwę physician.service_patients na patients przed dodaniem szablonu?

Dzięki Pete

Odpowiedz

16

Użyj z tagiem:

{% 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 %} 

Można również uaktualnić do tworzenia niestandardowych etykiet:

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

Chociaż niestandardowe znaczniki obejmować pisanie kodu Pythona, istnieją skróty, które sprawiają, że jest łatwy w użyciu istniejący plik szablonu jako znacznik: Django Inclusion Tags

+0

Dziękujemy! Szukałem tagu "as". Myślę, że "z" też działa. – slypete

+0

Jako Django 1.3 można również użyć stylu: '{% include" sometemplate.html "ze spamem = jaja, szynka =" Ham! " %} '. –

3

Kiedy masz „funkcjonalność” (konkretnie warunek if) wewnątrz pętli, masz okazję, aby przenieść to do funkcji widoku.

Pierwszy

ten konstrukt

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

jest tak powszechne, że masz kilka sposobów, aby tego uniknąć.

  1. Zmień model. Dodaj test 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, jeśli service_patients.count`, usuwając go z szablonu.

    Eliminuje to {% if%} z szablonu, redukując go do {% dla%} i rzeczywistego HTML, który nie może być łatwo wyeliminowany.

  2. Zmień funkcję widoku. Napisz kilka linijek kodu, aby utworzyć listę lekarzy z usługami służby zdrowia zamiast uproszczonego zbioru lekarzy. Ten kod w funkcji widoku ma test if service_patients.count, usuwając go z szablonu.

    Eliminuje to {% if%} z szablonu, redukując go do {% za%} i rzeczywistego kodu HTML, którego nie można łatwo wyeliminować.

Chodzi o to, aby pozbyć się {% if%}, aby po prostu wycinać i wklejać {% for%} i rzeczywisty HTML. Utrzymując szablon tylko HTML (które nie mogą być wyeliminowane), jedynym napowietrznych jest {% for%}

drugie

Wydaje się, że chcesz wykorzystać ponownie {% include %} skonstruować w nieco różnych kontekstów .

Nie jest wcale jasne, jaki jest problem z tym plikiem {% include %}. To "oczekiwanie, że lista pacjentów o nazwie patients" wydaje się powierzchownie głupia. Napraw to, więc oczekuje physician.patients.

Być może chcesz użyć tej samej listy dwa razy. Raz z listą o nazwie 'patients' i raz z listą o nazwie 'physician.patients'. W takim przypadku rozważ (a) uproszczenie lub (b) napisanie znacznika szablonu.

Wygląda na to, że masz listę pacjentów, która czasami jest stroną autonomiczną, a inne sytuacje są powtarzane wielokrotnie na znacznie bardziej złożonej stronie. Powtarzanie listy szczegółów osadzonych na jakiejś dłuższej liście nie jest tak naprawdę najlepszym projektem strony.Django ci w tym nie pomoże, bo - szczerze mówiąc - nie jest łatwo korzystać z tego. Stąd opcja (a) - rozważ przemodelowanie tej "listy pacjentów na liście lekarzy" jako zbyt złożonej.

Zawsze można jednak utworzyć znaczniki szablonów, aby tworzyć naprawdę złożone strony.

Podsumowanie

Jest to naprawdę dobry powód, dla którego język szablon Django ma ograniczoną funkcjonalność. Cała twoja funkcja powinna być albo istotną cechą twojego modelu, albo cechą bieżącej aplikacji, która używa tego modelu.

Prezentacja jest po prostu tłumaczeniem obiektów (i zapytań) na HTML. Nic więcej

+0

S.Lott, nie jestem pewien, w jaki sposób to zdalnie odpowiada na moje pytanie o ponowne użycie mojego szablonu, który oczekuje obiektu nazwanego pacjentami. – slypete

+0

Czy mógłbyś wyjaśnić, ponieważ wciąż jestem w ciemności? – slypete

+0

S.Lott, dzięki za wyjaśnienia. W połączeniu z takim interfejsem jak interfejs jQuery UI, powtarzanie tego samego szablonu w bardziej złożonym kontekście staje się bardzo użyteczne. Znacznik with jest poprawnym rozwiązaniem mojego pytania. – slypete

1

W ten sposób możesz spróbować użyć standardowego języka szablonowania jinja. Jest bardziej elastyczny.

+0

Zaczynam wierzyć, że silnik szablonowy Django jest tak ograniczony, że powinien być po prostu wyrzucony. – slypete

Powiązane problemy