2010-06-15 9 views
10

Czy istnieje sposób na sprawienie, aby liczba rekordów/obiektów dla modelu pojawiła się na głównej liście modeli w module administratora django?Jak wyświetlić całkowitą liczbę rekordów dla modeli w django admin

Znalazłem techniki wyświetlania liczby powiązanych obiektów w zestawach na stronie lista_danych (i widzę sumę w sekcji paginacji na dole tego samego), ale nie natknąłem się na schludny sposób, aby pokazać liczba rekordów na poziomie listy modeli.

+0

Czy chcesz uzyskać liczbę WSZYSTKICH zarejestrowanych modeli w admin django? – dzida

+0

Niekoniecznie. Szczególnie interesuje mnie jeden z nich. – Rog

+0

Jestem ciekawa, jak w końcu udało Ci się rozwiązać swój problem? –

Odpowiedz

3

Zajrzałbym do klasy model.Manager. Podklasa Menedżera pozwoli Ci dodać funkcjonalność poziomu tabel do swoich modeli. Metoda Managera może zwracać dowolne dane i jest interesujący przykład w Django DB API documentation. Możesz wtedy przenieść go do administratora, dodając klasę wewnętrzną administratora do swojego modelu.

1

Nie znalazłem żadnego fajnego sposobu na dodanie liczby modeli na głównej stronie administratora, ale tutaj jest rozwiązanie, które w końcu wykorzystuję.

W skrócie obliczam liczbę poszczególnych modeli w sygnałach post_delete i post_save method, przechowuj zmienne w niestandardowym żądaniu (na mapie) i wyświetlaj je w rozszerzonym admin index.html, po prostu zaznaczając if dla każdego pożądane modele.

Rozszerzony Szablony/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 %} 

Moja prośba zwyczaj w util/context_processors.py:

from myproject import settings 

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

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

Jeśli masz dużo modeli, proponuję, aby przekształcić to w sposób bardziej ogólny rozwiązania.

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

Następnie należy skopiować i zastąpić "/templates/admin/index.html" z "Django contrib/admin/szablony/index.html".

Na początku ADD:

{% load NAME_OF_YOUR_TAG_FILE %} 

Dodaj następujące połączenia po nazwie modelu lub gdziekolwiek:

{% get_model_count model.admin_url %} 

To pasuje do tego przypadku użycia. Jesteś skończony!

Powiązane problemy