2011-08-16 6 views
31

quindi voglio fare qualcosa di simile di seguito:Tag di Django {% con%} compresi tra {% if%} {% else%}?

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

Ma Django mi sta dicendo che ho bisogno di un altro tag {% endwith%}. Esiste un modo per riorganizzare i con per fare in modo che funzioni, o l'analizzatore sintattico è spensieratamente spensierato riguardo a questo genere di cose?

Forse sto andando su questo nel modo sbagliato. C'è qualche sorta di best practice quando si tratta di qualcosa di simile?

risposta

47

se si desidera rimanere ASCIUTTI, utilizzare un inclusione.

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

o, ancor meglio sarebbe scrivere un metodo sul modello che incapsula la logica di base:

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

Poi nel modello:

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

Poi, in futuro, se la logica di chi è legalmente responsabile cambia, hai un posto in cui cambiare la logica - molto più SECCO che dover cambiare le affermazioni in una dozzina di modelli.

+4

Potresti essere DRYer. Usa '{% include" snipet.html "con a = b%}' (sebbene questa sia probabilmente una cosa recente di Django) – Patrick

+2

il 'get_legally_responsible_party' è più secco. – benzkji

7

Ti piace questa:

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

Se il codice HTML è troppo grande e non si vuole ripetere, quindi la logica sarebbe meglio essere collocato nella vista. È possibile impostare questa variabile e passarlo al contesto del modello:

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

e poi basta usare {{p}} nel modello.

+0

Questo è quello che temevo. Cerco di mantenere ASCIUTTO, ma se questo è l'unico modo, allora così sia. Grazie! –