2011-08-16 19 views
31

por lo que quiero hacer algo como sigue:Django {% with%} etiquetas dentro de {% if%} {% else%} etiquetas?

{% if age > 18 %} 
    {% with patient as p %} 
{% else %} 
    {% with patient.parent as p %} 
    ... 
{% endwith %} 
{% endif %} 

Pero Django me está diciendo que necesito otra etiqueta {%} endwith%. ¿Hay alguna forma de reordenar los elementos para hacer que esto funcione, o es el analizador sintáctico deliberadamente despreocupado con respecto a este tipo de cosas?

Tal vez estoy haciendo esto de la manera incorrecta. ¿Hay algún tipo de mejor práctica cuando se trata de algo como esto?

Respuesta

47

si desea permanecer SECO, utilice un incluir.

{% if foo %} 
    {% with a as b %} 
    {% include "snipet.html" %} 
    {% endwith %} 
{% else %} 
    {% with bar as b %} 
    {% include "snipet.html" %} 
    {% endwith %} 
{% endif %} 

o, aún mejor sería escribir un método en el modelo que encapsula la lógica de la base:

def Patient(models.Model): 
    .... 
    def get_legally_responsible_party(self): 
     if self.age > 18: 
      return self 
     else: 
      return self.parent 

Luego, en la plantilla:

{% with patient.get_legally_responsible_party as p %} 
    Do html stuff 
{% endwith %} 

Luego, en el futuro, si la lógica de quién es legalmente responsable cambia, tiene un lugar único para cambiar la lógica, mucho más SECO que tener que cambiar las instrucciones en una docena de plantillas.

+4

Puede ser DRYer. Use '{% include" snipet.html "con a = b%}' (aunque esto probablemente sea algo reciente de Django) – Patrick

+2

el 'get_legally_responsible_party' es el más seco. – benzkji

7

De esta manera:

{% if age > 18 %} 
    {% with patient as p %} 
    <my html here> 
    {% endwith %} 
{% else %} 
    {% with patient.parent as p %} 
    <my html here> 
    {% endwith %} 
{% endif %} 

Si el html es demasiado grande y no quiero repetirlo, entonces la lógica sería mejor colocar en la vista. Establece esta variable y pasarlo al contexto de la plantilla:

p = (age > 18 && patient) or patient.parent 

y luego sólo tiene que utilizar {{p}} en la plantilla.

+0

Eso es lo que temía. Trato de mantener SECO, pero si esta es la única forma, entonces así será. ¡Gracias! –