2008-09-28 9 views
9

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:

  1. poner el formato en models.py

  2. poner la lógica/formato en views.py

  3. Ponga la lógica/formateo en alguna otra subclase de Persona o Dirección (es decir, direcciones/html4.py)

  4. Crear etiquetas personalizadas

Ayuda/idea muy apreciada!

Respuesta

13

suena como una inclusion tag es lo que estás buscando. Puede tener una plantilla y una etiqueta para cada variación importante y usar los argumentos de la etiqueta para personalizar el contexto para cada plantilla según sea necesario.

definición de la etiqueta básica:

@register.inclusion_tag('person/address.html') 
def display_address(address): 
    return {'address': address} 

uso de plantillas (suponiendo que el módulo que contiene templatetag que ya ha sido {% load %} -ed):

{% display_address address %} 
+0

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. –

2

me gustaría utilizar una etiqueta plantilla de salida de datos utilizando una plantilla de archivo html una k un inclusion-tag

1

creo filtro de plantilla será útil también. Puede pasar el filtro en cada objeto, por ejemplo:

{{ value|linebreaks }} # standard django filter 

producirá:

If value is Joel\nis a slug, the output will be <p>Joel<br>is a slug</p>. 

Ver Django Built-in template tags and filters referencia completa.

Cuestiones relacionadas