2010-06-15 9 views
10

Gibt es eine gute Möglichkeit, die Datensatz-/Objektanzahl für ein Modell in der Hauptmodellliste im django admin-Modul erscheinen zu lassen?Wie wird die Gesamtzahl der Datensätze für Modelle in django admin angezeigt?

Ich habe Techniken gefunden, um die Anzahl verwandter Objekte in Sätzen auf der list_display-Seite anzuzeigen (und ich kann die Gesamtsumme im Paginierungsabschnitt unten sehen), bin aber nicht auf eine nette Art zum Anzeigen gekommen die Datensatzanzahl auf der Modelllistenebene.

+0

Möchten Sie die Anzahl aller registrierten Modelle in django admin erhalten? – dzida

+0

Nicht unbedingt. Es gibt eine, die mich besonders interessiert. – Rog

+0

Ich bin neugierig, wie hast du dein Problem endlich gelöst? –

Antwort

3

Ich würde in die models.Manager-Klasse schauen. Mit einer Unterklasse von Manager können Sie Ihren Modellen Funktionen auf Tabellenebene hinzufügen. Eine Manager-Methode kann beliebige Daten zurückgeben, und es gibt ein interessantes Beispiel in Django DB API documentation. Sie können dies möglicherweise in den Admin ziehen, indem Sie Ihrem Modell eine innere Admin-Klasse hinzufügen.

1

Ich fand keine nette Möglichkeit, die Anzahl der Modelle in der Haupt-Admin-Seite hinzuzufügen, aber hier ist die Lösung, die ich schließlich verwende.

Kurz gesagt, ich berechne die Zählungen jedes Modells in den Signalen post_delete und post_save Methoden, speichern die Variablen in der benutzerdefinierten Anfrage (in einer Karte) und zeigen sie im erweiterten admin index.html durch einfaches Überprüfen mit einem if für jeden gewünschte Modelle.

Die erweiterte 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 %} 

Meine individuelle Anfrage in util/context_processors.py:

from myproject import settings 

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

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

Wenn Sie viele Modelle haben, schlage ich vor, dass Sie dies in einer allgemeineren Lösung verwandeln.

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

Dann kopieren und überschreiben "/templates/admin/index.html" von "Djangos contrib/admin/templates/index.html".

An der Spitze add:

{% load NAME_OF_YOUR_TAG_FILE %} 

Fügen Sie den folgenden Aufruf nach dem Modellnamen oder wo auch immer:

{% get_model_count model.admin_url %} 

Dies paßt gut in diesen Anwendungsfall. Sie sind fertig!

Verwandte Themen