2010-06-15 2 views
10

Có cách nào gọn gàng để làm cho số lượng bản ghi/đối tượng cho mô hình xuất hiện trong danh sách mô hình chính trong mô-đun quản trị django không?Cách hiển thị tổng số bản ghi đối với các mô hình trong quản trị django

Tôi đã tìm thấy các kỹ thuật để hiển thị số lượng đối tượng liên quan trong tập hợp trong trang list_display (và tôi có thể thấy tổng số trong phần phân trang ở dưới cùng), nhưng chưa xem qua một cách gọn gàng để hiển thị số lượng bản ghi ở cấp danh sách mô hình.

+0

Bạn có muốn nhận số lượng TẤT CẢ các mô hình đã đăng ký trong quản trị django không? – dzida

+0

Không nhất thiết. Có một điểm đặc biệt mà tôi quan tâm. – Rog

+0

Tôi tò mò, cuối cùng bạn đã giải quyết vấn đề của mình như thế nào? –

Trả lời

3

Tôi sẽ xem xét các lớp mô hình.Manager. Một lớp con của Trình quản lý sẽ cho phép bạn thêm chức năng cấp bảng vào các mô hình của bạn. Một phương thức Manager có thể trả về bất kỳ dữ liệu nào bạn muốn và có một ví dụ thú vị trong Django DB API documentation. Sau đó bạn có thể kéo điều này vào Quản trị bằng cách thêm lớp quản trị bên trong vào mô hình của bạn.

1

Tôi không tìm thấy bất kỳ cách hay nào để thêm số lượng mô hình trong trang quản trị chính, nhưng đây là giải pháp mà cuối cùng tôi đã sử dụng.

Tóm lại, tôi tính toán số lượng của từng mô hình trong các phương thức post_delete và post_save, lưu các biến trong yêu cầu tùy chỉnh (trong bản đồ) và hiển thị biến trong index.html admin chỉ bằng cách kiểm tra nếu có các mô hình mong muốn.

Các mở rộng 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 %} 

yêu cầu tùy chỉnh của tôi trong util/context_processors.py:

from myproject import settings 

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

Trong settings.py tôi:

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) 

Nếu bạn có rất nhiều mô hình, tôi đề nghị bạn nên chuyển đổi này trong một giải pháp chung chung hơn.

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

Sau đó sao chép và ghi đè "/templates/admin/index.html" từ "django's contrib/admin/templates/index.html".

Tại add top:

{% load NAME_OF_YOUR_TAG_FILE %} 

Thêm cuộc gọi sau đây sau tên mô hình hoặc bất cứ nơi nào:

{% get_model_count model.admin_url %} 

này vừa vặn vào trường hợp sử dụng này. Bạn đã hoàn tất!