2010-06-15 2 views
10

Existe-t-il une manière élégante de faire apparaître le nombre d'enregistrements/objets d'un modèle dans la liste principale du modèle dans le module d'administration django?Comment afficher le nombre total d'enregistrements par rapport aux modèles dans l'admin django

J'ai trouvé des techniques pour montrer les comptes d'objets liés dans des ensembles dans la page list_display (et je peux voir le total dans la section de pagination au bas de la même), mais je n'ai pas trouvé le nombre d'enregistrements au niveau de la liste de modèles.

+0

Voulez-vous obtenir le nombre de TOUS les modèles enregistrés dans admin django? – dzida

+0

Pas nécessairement. Il y en a un en particulier qui m'intéresse. – Rog

+0

Je suis curieux, comment avez-vous enfin résolu votre problème? –

Répondre

3

Je voudrais regarder dans la classe models.Manager. Une sous-classe de Manager vous permettra d'ajouter des fonctionnalités de niveau table à vos modèles. Une méthode Manager peut renvoyer toutes les données que vous voulez et il existe un exemple intéressant dans le Django DB API documentation. Vous pourrez alors extraire ceci dans Admin en ajoutant une classe interne admin à votre modèle.

1

Je n'ai pas trouvé de façon sympa d'ajouter le nombre de modèles dans la page d'administration principale, mais voici la solution que j'utilise enfin. En bref, je calcule les comptes de chaque modèle dans les signaux post_delete et post_save, stocke les variables dans la requête personnalisée (dans une carte) et l'affiche dans l'index admin.html en vérifiant simplement avec un if pour chaque modèles souhaités.

Le étendu templates/admin/index.html:

{% if model.perms.change %} 
    <th scope="row"><a href="{{ model.admin_url }}">{{ model.name }} 
    {% if model.name == "Mymodel1_verbose_name_plural" %} ({{ MODELS_COUNT.Mymodel1}}) {% endif %} 
    </a></th> 
{% else %} 

Ma demande personnalisée dans util/context_processors.py:

from myproject import settings 

def myproject(request): 
    return { 
     'request' : request, 
     'MODELS_COUNT' : settings.MODELS_COUNT 
    } 

Dans mon settings.py:

MODELS_COUNT = { 
     'Mymodel1': None, 
     'Mymodel2': None  
} 

TEMPLATE_CONTEXT_PROCESSORS = (
    ... 
    'myproject.util.context_processors.myproject', 
) 

I n myproject.__init__.py:

from django.db.models.signals import post_save, post_delete 

def save_mymodel1_count(sender, instance=None, **kwargs): 
    if kwargs['created']: 
     settings.MODELS_COUNT['Mymodel1'] = Mymodel1.objects.count() 
def delete_mymodel1_count(sender, instance=None, **kwargs): 
    settings.MODELS_COUNT['Mymodel1'] = Mymodel1.objects.count() 
settings.MODELS_COUNT['Mymodel1'] = Mymodel1.objects.count() 

post_save.connect(save_mymodel1_count, sender=Mymodel1) 
post_delete.connect(delete_mymodel1_count, sender=Mymodel1) 

Si vous avez beaucoup de modèles, je vous suggère de transformer cela en une solution plus générique.

3
from django import template 
from django.db.models.loading import get_model 

register = template.Library() 

@register.simple_tag() 
def get_model_count(admin_url): 
    app_label, model_name = admin_url.split('/')[:2] 
    return get_model(app_label, model_name, seed_cache=False).objects.count() 

copie et ensuite override "/templates/admin/index.html" de "contrib de django/admin/templates/index.html".

Au top ajouter:

{% load NAME_OF_YOUR_TAG_FILE %} 

Ajouter l'appel suivant après le nom du modèle ou où:

{% get_model_count model.admin_url %} 

Cela correspond bien dans ce cas d'utilisation. Vous avez terminé!

Questions connexes