2010-02-07 14 views
22

Tengo un objeto de base de datos llamado manor_stats, con alrededor de 30 campos. Para la mayoría de las filas, la mayoría de estos campos serán nulos.Plantillas Django: recorre e imprime todas las propiedades disponibles de un objeto?

En mi plantilla, me gustaría recorrer todos los campos de la fila, e imprimir información solo para los campos que no son nulos.

Por ejemplo, hay un campo llamado "nombre": me gustaría imprimir <li>Name: {{ manor_stats.name }}</li> en la plantilla SÓLO para aquellos objetos donde el campo no es nulo. Idealmente, me gustaría obtener "Nombre:" de algún lugar automáticamente también, en lugar de especificarlo.

Sé que podría usar {% if manor_stats.name %} para comprobar si cada campo es nulo, pero no quiero hacerlo 30 veces para todos los campos.

Esto es lo que tengo en views.py:

manor_stats = Manors.objects.get(idx=id) 
return render_to_response('place.html', { 'place' : place, 'manor_stats' : manor_stats }, context_instance = RequestContext(request)) 

Y luego, en place.html, me gustaría tener algo que funciona aproximadamente como este (pseudocódigo, con ??? lo que indica que los bits no sé cómo hacerlo):

{% if manor_stats %} 
<ul> 
{% for manor_stats.property??? in manor_stats %} 
    {% if manor_stats.property %} 
    <li>{{ manor_stats.property.field_name??? }} {{ manor_stats.property.value??? }}</li> 
    {% endif %} 
{% endfor % 
{% endif %} 

esperanza que tiene sentido ...

+2

duplicado exacto: http://stackoverflow.com/questions/2170228/django-iterate-over-model- instance-field-names-and-values-in-template –

Respuesta

49

se podría añadir un método para su modelo Manors que devolverá todos los valores de los campos, de ahí que sólo puede lazo sobre estos valores en su plantilla revisando para ver si el valor no es nulo.

- models.py

class Manors(models.Model) 
    #field declarations 

    def get_fields(self): 
    return [(field.name, field.value_to_string(self)) for field in Manors._meta.fields] 

- manor_detail.html

{% for name, value in manor_stats.get_fields %} 
    {% if value %} 
    {{ name }} => {{ value }} 
    {% endif %} 
{% endfor %} 
+1

Funciona perfectamente, es exactamente lo que estaba buscando. ¡Gracias! – AP257

+1

¿Sabes cómo podría devolver field.verbose_name junto con el valor de alguna manera? Supongo que es solo una cuestión de la sintaxis de Django correcta, pero estoy desconcertado :( – AP257

+1

Hice algunos cambios en mi respuesta original. El atributo de nombre adjunto al campo debería darle lo que desea. – buckley

Cuestiones relacionadas