2011-09-15 9 views
5

je dois afficher plusieurs modèles nommer & objets dans un modèleDjango - modèle d'affichage modèle verbose_names et objets

Voici ma vue

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) 
) 

Et mon modèle

{% 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 %} 

Bien sûr objs._meta.verbose_name ne fonctionne pas

Existe-t-il un moyen d'accéder à ce nom verbeux sans avoir à créer une fonction pour chaque modèle ou à affecter la valeur de la vue pour chaque modèle?

Répondre

11

Pour y accéder dans votre modèle, vous avez probablement déjà remarqué que Django ne vous permet pas d'utiliser les préfixes de soulignement pour accéder aux attributs des modèles. Ainsi, la meilleure façon d'accéder au nom verbeux pour un objet donné sans avoir à créer une méthode de modèle sur chaque modèle serait de créer simplement une étiquette de modèle:

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

non apparentés, mais vous avez un bug dans votre modèle , en ce que vous essayez d'accéder à l'attribut _meta sur un ensemble de requêtes au lieu d'un objet. Donc, votre ligne de titre devrait ressembler à quelque chose comme:

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

Travail. J'ai utilisé '{% get_verbose_name objs.0%}' finalement (pas sûr que cela fonctionnera s'il n'y a pas de valeur). –

+0

Glad it helps! – Spike

+9

Peut-être que l'utilisation d'un filtre est plus propre. C'est presque la même implémentation, mais la méthode d'appel est meilleure. Quelque chose comme '{{obj | verbose_name}}' ou '{{obj.0 | verbose_name}}' –