2011-09-15 15 views
5

que necesito para mostrar varios modelos nombrar & objetos en una plantillaDjango - plantilla verbose_names modelo de pantalla y objetos

Aquí es mi vista

def contents(request): 
    """Lists contents""" 
    objects = [ 
    Model1.objects.all(), 
    Model2.objects.all(), 
    Model3.objects.all(), 
    Model4.objects.all(), 
    ] 
    return render_to_response('content/contents.html', objs 
    , context_instance=RequestContext(request) 
) 

Y mi plantilla

{% for objs in objects %} 
    <div class="content"> 
    <div class="title">{{ objs._meta.verbose_name }}</div> 
    <ul> 
    {% for obj in objs %} 
     <li>{{ obj }}</li> 
    {% endfor %} 
    </ul> 
    </div> 
{% endfor %} 

Por supuesto objs._meta.verbose_name no funciona

¿Hay alguna manera de acceder a este nombre detallado sin tener que crear una función para cada modelo o asignar el valor de la vista para cada modelo?

Respuesta

11

Para acceder a ella en su plantilla, probablemente ya haya notado que Django no le permite usar los prefijos de subrayado para acceder a los atributos de las plantillas. Por lo tanto, la forma más fácil de acceder al nombre descriptivo para cualquier objeto dado sin tener que crear un método de modelo en cada modelo sería simplemente crear una etiqueta de plantilla:

@register.simple_tag 
def get_verbose_name(object): 
    return object._meta.verbose_name 

no relacionados, pero hay un error en su plantilla , en el sentido de que está intentando acceder al atributo _meta en un conjunto de consulta en lugar de un objeto. Por lo tanto, su línea de título debería tener el siguiente aspecto:

{% with objs|first as obj %} 
    <div class="title">{% get_verbose_name obj %}</div> 
{% endwith %} 
+0

Trabajo. Usé '{% get_verbose_name objs.0%}' finally (no estoy seguro si funcionará si no hay ningún valor). –

+0

¡Me alegro de que haya sido útil! – Spike

+9

Quizás usar un filtro es más limpio. Es casi la misma implementación, pero el método de llamada se ve mejor. Algo como '{{obj | verbose_name}}' o '{{obj.0 | verbose_name}}' –

Cuestiones relacionadas