web-dev-qa-db-fra.com

Nom du modèle des objets dans Django modèles

Y a-t-il un moyen d'obtenir le nom du modèle de tous les objets dans Django Modèles. Manuellement, nous pouvons l'essayer en définissant des méthodes dans des modèles ou en utilisant des étiquettes de modèle ... mais y a-t-il une intégrée intégrée manière?

36
Neo

object.__class__.__name__ ou object._meta.object_name devrait vous donner le nom de la classe modèle. Cependant, cela ne peut pas être utilisé dans des modèles car les noms d'attribut commencent par un soulignement.

Il n'est pas intégré pour obtenir cette valeur à partir des modèles, vous devrez donc définir une méthode de modèle qui renvoie cet attribut, ou pour une solution plus générique/réutilisable, utilisez un filtre de modèle:

@register.filter
def to_class_name(value):
    return value.__class__.__name__

que vous pouvez utiliser dans votre modèle comme suit:

{{ obj | to_class_name }}
57
Shawn Chin

Vous ne pouvez pas accéder directement au nom de la classe. Faire quelque chose comme ça:

{{ object.__class__ }}

va causer un TemplateSyntaxError: Variables and attributes may not begin with underscores. =Django Je ne vous laisse pas accéder à ces sortes d'attributs - Python Conventions signifie qu'ils sont cachés des détails de mise en œuvre, ne faisant pas partie de l'API de l'objet.

Créez un filtre de modèle à la place, puis vous pouvez l'utiliser comme suit:

{{ object|model_name_filter }}

Créer des filtres est très facile: https://docs.djangoproject.com/fr/dev/howto/custom-template-tags/

5
Gareth

Django a ajouté une API accessible au public aux options de modèle appelées _méta, mais vous ne pouvez toujours pas accéder à des variables avec un soulignement dans le modèle. Utilisez un filtre de modèle:

@register.filter
def verbose_name(instance):
    return instance._meta.verbose_name

Dans le modèle:

{{ instance|verbose_name }}

J'aime même chaîner le filtre title pour capitaliser les mots de mon modèle:

{{ instance|verbose_name|title }}
0
Bobort