2011-09-21 69 views
9

Trong trang chỉ mục quản trị Django, ứng dụng và các mô hình của nó sẽ được liệt kê bình thường. Làm cách nào để các đối tượng mô hình cũng được liệt kê trong trang chỉ mục này? Thay vì chỉ hiển thị ứng dụng, tôi cũng muốn hiển thị các đối tượng mô hình của nó. Làm thế nào nó nên được tùy chỉnh?Tùy chỉnh trang chỉ mục quản trị Django để hiển thị các đối tượng mô hình

enter image description here

Trả lời

12

Tôi muốn có cùng chức năng cho trang web của mình và thêm nó bằng cách thực hiện các thay đổi nhỏ đối với hệ thống django lõi.

Bước 1: Trước tiên, chúng tôi cần một cách để cho biết các mô hình nào sẽ được liệt kê các thuộc tính của chúng. Thêm mã sau đây để các mô hình mà bạn muốn các trường hợp niêm yết (trong models.py):

class Meta: 
    list_instances = True 

Bước 2: Chúng tôi cần phải sửa đổi Django để nhận biết và đọc thuộc tính mới này. Trong tập tin lõi-django: db/mô hình/options.py, xấp xỉ tại dòng 22 append 'list_instances' để DEFAULT_NAMES:

DEFAULT_NAMES = ('verbose_name', 'verbose_name_plural', 'db_table', 'ordering', 
      'unique_together', 'permissions', 'get_latest_by', 
      'order_with_respect_to', 'app_label', 'db_tablespace', 
      'abstract', 'managed', 'proxy', 'auto_created', 'list_instances') 

và trong cùng một tập tin, khoảng ở dòng 52, tạo ra một lĩnh vực mặc định cho thuộc tính này ngay sau khi các thuộc tính khác:

self.list_instances = False 

Bước 3: Chúng tôi cần phải vượt qua thông tin này cho các mẫu mà tạo ra trang index. Trong tập tin lõi-django: contrib/admin/sites.py, bên trong chỉ mục() phương pháp và bên trong "nếu has_module_perms:" một phần, thêm đoạn mã sau:

instances = [] 
if (model._meta.list_instances == True): 
    instances = model_admin.queryset(None) 

này sẽ tạo ra danh sách các trường hợp để hiển thị , nhưng chỉ khi thuộc tính list_instance được đặt. Trong cùng một tệp, một vài dòng tiếp tục hạ xuống, thêm các giá trị này vào cấu trúc "model_dict".

model_dict = { 
    'name': capfirst(model._meta.verbose_name_plural), 
    'admin_url': mark_safe('%s/%s/' % (app_label, model. __name__.lower())), 
    'perms': perms, 
    'list_instances':model._meta.list_instances, 
    'instances': instances, 
} 

Bước 4: Bước cuối cùng là thay đổi mẫu để hỗ trợ này. Hãy chỉnh sửa tệp core-django /contrib/admin/templates/admin/index.html hoặc sao chép tệp này vào thư mục templates/admin/của ứng dụng cụ thể của bạn. Thêm một vài dòng sau mã tiêu chuẩn để tạo hàng để tạo "hàng phụ" nếu có. Xấp xỉ tại dòng 40, ngay giữa "/ tr>" và "{% endfor%}":

{% if model.list_instances %} 
    {% for instance in model.instances %} 
    <tr> 
     <td colspan="2" style="padding-left: 2em;">{{ instance }}</td> 
     {% if model.perms.change %} 
      <td><a href="{{ model.admin_url }}{{ instance.id }}/" class="changelink">{% trans 'Change' %}</a></td> 
     {% else %} 
      <td>&nbsp;</td> 
     {% endif %} 
    </tr> 
    {% endfor %} 
{% endif %} 

Điều này sẽ gây ra các mục được liệt kê với tên được tạo ra bởi unicode() phương pháp trong mô hình.

Bước 5: Lo and behold!Nó sẽ giống như thế này:

enter image description here

Edit: Tùy chọn Bước 6: Nếu bạn muốn tên dụ được nhấp quá, chỉ cần thay đổi mẫu (index.html) và thay thế:

<td colspan="2" style="padding-left: 2em;">{{ instance }}</td> 

với:

<td colspan="2" style="padding-left: 2em;">   
    {% if model.perms.change %}    
     <a href="{{ model.admin_url }}{{ instance.id}}">{{ instance }}</a> 
    {% else %} 
     {{ instance }} 
    {% endif %} 
</td> 
+0

giải thích tốt đẹp !! cảm ơn!! – Nava

+1

bạn đã dạy như một giáo viên ;-) cảm ơn một lần nữa. – Nava

+2

Không sao cả. :) Tôi cũng cần nó cho bản thân mình. Nếu bạn cũng muốn nó khi nhấp vào ứng dụng cụ thể của bạn, đi đến contrib/admin/sites.py một lần nữa và thêm cùng một vài hàng như bạn đã làm trong phương thức index() vào phương thức app_index(). – Setomidor

1

Bạn có thể làm điều này bằng cách thay đổi các mẫu quản trị khác nhau - một trong những gốc được gọi là app_index.html và kiểm soát những gì được hiển thị ở đó. Cách tốt nhất để điều tra những gì đang xảy ra ở đâu là cài đặt django-debug-toolbar và sau đó xem các mẫu đang được sử dụng cho mỗi chế độ xem để tìm hiểu cách tùy chỉnh.

+1

Hoàn toàn đúng ... nhưng đây là con đường dài tối để đi xuống, tôi đã thử nó trước đây. Các django-admin đã không được thực hiện để được đặc biệt mô-đun hoặc mở rộng. Bạn có hoàn toàn chắc chắn rằng người dùng không thể chỉ cần nhấp vào một trong các liên kết này trước tiên? – Dave

0

CẬP NHẬT Se câu trả lời tomidor cho django 10

Luôn tuyệt vời để trở lại giải pháp sạch này!

bước 2 - đó là xung quanh dòng 125 (là 52)

bước 3 - trong sites.py - cập nhật các phương pháp mới -

_build_app_dict 

bên trong vòng lặp for: for model, model_admin in models.items():

thêm bước 3 như đã nói quanh các đường 430 và 460

instances = [] 


if (model._meta.list_instances == True): 
    instances = model_admin.get_queryset(None) 
Các vấn đề liên quan