Esta pregunta se relaciona con (pero quizás no es lo mismo que):En Django, ¿dónde es el mejor lugar para poner fragmentos cortos de datos con formato HTML?
Does Django have HTML helpers?
Mi problema es el siguiente: En Django, estoy constantemente reproduciendo el formato básico para los objetos de la base de bajo nivel. Aquí hay un ejemplo:
Tengo dos clases, Persona y Dirección. Existen múltiples direcciones para cada persona, likeso de configuración (en sus respectivos models.py)
class Person(models.Model):
...
class Address(models.Model):
contact = models.ForeignKey(Person)
Ahora, cuando miro a una persona, quiero ver todas sus direcciones. Así que supongamos Personas/views.py tiene algo likeso:
def detail(request, person_id):
person = get_object_or_404(Person, pk=person_id)
return render_to_response('persons/details.html',
{ 'title' : unicode(person), 'addresses': person.address_set.all() })
Y, tengo una plantilla, personas/details.html, con el código, por ejemplo, likeso:
{% extends "base.html" %}
{% for address in addresses %}
<b>{{ address.name }}</b>
{{ address.type }} <br>
{{ address.street_1 }}<br>
{{ address.street_2 }}<br>
{{ address.city }} {{ address.stateprov }} {{ address.postalcode }}<br>
{{ address.country }}
<hr>
{{ endfor }}
Estoy repitiendo este código bastante, a menudo con pequeñas variaciones, como cuando está en una tabla, y luego < br> debe sustituirse por </td> < td>. Otras veces, no quiero que se muestre street_2 (o < br> después). ¡Todo para decir, hay una lógica fundamental que quiero expresar, que soy aún más detestable con el bloqueo y la copia!
Lo que yo quiero es un personas/details.html con, por ejemplo, lo siguiente: (supongo)
{% extends "base.html" %}
{% for address in addresses %}
{% address.as_html4 %}
{% endfor %}
Y si quiero tabla en línea, algo likeso:
{% extends "base.html" %}
<table><tr>
{% for address in addresses %}
<tr><td> {% address.as_html4 </td><td> %} </td></tr>
{% endfor %}
</table>
La pregunta es, entonces, ¿dónde está el mejor lugar para poner el formato? ¿La lógica?
Django parecen tener las (posibles) opciones siguientes:
poner el formato en models.py
poner la lógica/formato en views.py
Ponga la lógica/formateo en alguna otra subclase de Persona o Dirección (es decir, direcciones/html4.py)
Crear etiquetas personalizadas
Ayuda/idea muy apreciada!
Una alternativa que he encontrado, por cierto, que puede valer la pena mencionar es Jinja2, que es similar a las plantillas de Django y tiene macros en línea. –