2009-08-12 25 views
11

Creo que el lenguaje de plantillas de django es muy limitado. Siguiendo con el principio DRY de django, tengo una plantilla que me gustaría usar en muchas otras plantillas. Por ejemplo, una lista de pacientes:¿Reutilizando plantillas de django?

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

El problema es que la plantilla patient_list está a la espera de una lista de pacientes con nombre patients. ¿Cómo puedo cambiar el nombre de physician.service_patients a patients antes de incluir la plantilla?

Gracias, Pete

Respuesta

16

Usar la con la etiqueta:

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

También puede actualizar a la creación de una etiqueta personalizada:

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

Aunque etiquetas personalizadas implican la escritura de código Python, hay atajos que hacen que sea fácil de usar un archivo de plantilla existente como una etiqueta: Django Inclusion Tags

+0

¡Gracias! Seguí buscando una etiqueta "como". Creo que "con" también funciona. – slypete

+0

A partir de Django 1.3 también puede usar el estilo: '{% include" sometemplate.html "con spam = eggs, ham =" Ham! " %} '. –

3

Cuando se tiene "funcionalidad" (en concreto una condición if) dentro de un bucle, que tienen la oportunidad de pasar esto en la función de vista.

Primera

esta construcción

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

es tan común que tiene varias maneras de evitarlo.

  1. Cambia tu modelo. Agregue una prueba 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 service_patients.count`, eliminándola de su plantilla.

    Esto elimina el {% if%} de su plantilla, reduciéndola a {% for%} y el HTML real, que no puede eliminarse fácilmente.

  2. Cambie su función de visualización. Escriba unas líneas de código para crear una lista de médicos con service_patients en lugar de una colección simplista de médicos. Este código en su función de vista tiene la prueba if service_patients.count, eliminándola de su plantilla.

    Esto elimina el {% if%} de su plantilla, reduciéndolo a un {% para%} y el HTML real, que no se puede eliminar fácilmente.

El punto es deshacerse de la {% if%} de manera que usted es simplemente cortando y pegando el {% for%} y el código HTML real. Al mantener su plantilla a sólo el HTML (que no se pueden eliminar), la única cabeza es el {% for%}

Segunda

Parece que desea volver a utilizar una {% include %} construir en contextos ligeramente diferentes .

No está del todo claro cuál es el problema con este archivo {% include %}. Es "esperar una lista de pacientes llamados patients" parece superficialmente tonto. Solucionarlo, por lo que espera physician.patients.

Quizás desee utilizar esta misma lista dos veces. Una vez con una lista llamada 'patients' y una vez con una lista llamada 'physician.patients'. En este caso, considere (a) simplificar o (b) escribir una etiqueta de plantilla.

Parece que tiene una lista de pacientes que a veces es una página independiente, y otras veces se repite muchas veces en una página mucho más compleja. Repetir una lista de detalles incrustados en una lista más larga no es realmente el mejor diseño de página.Django no lo ayuda con esto porque, francamente, no es fácil de usar. De ahí la opción (a): considere rediseñar esta lista de "lista de pacientes dentro de un médico" como demasiado compleja.

Sin embargo, siempre puede escribir una plantilla de etiquetas para crear páginas realmente complejas.

Resumen

Hay una muy buena razón por la cual el lenguaje de plantillas de Django tiene una funcionalidad limitada. Toda su funcionalidad debe ser una característica esencial de su modelo o una característica de la aplicación actual que usa el modelo.

La presentación es simplemente la traducción de objetos (y conjuntos de consultas) en HTML. Nada más

+0

S.Lott, no estoy seguro de cómo esto siquiera remotamente responde mi pregunta sobre la reutilización de mi plantilla que está esperando un objeto llamado pacientes. – slypete

+0

¿Puedes por favor elaborar ya que todavía estoy en la oscuridad? – slypete

+0

S.Lott, gracias por la aclaración. Cuando se combina con algo así como la interfaz con pestañas de jQuery UI, repetir la misma plantilla en un contexto más complejo se vuelve muy útil. La etiqueta con es la solución correcta para mi pregunta. – slypete

1

De esta manera, puede intentar utilizar en lenguaje de plantillas de calidad jinja. Es mas flexible

+0

Estoy empezando a creer que el motor de plantillas de django es tan limitante que también debería desecharse. – slypete