2011-01-25 47 views
20

Câu hỏi nhanh (về không phải) về mở rộng mẫu quản trị django.Mở rộng Mẫu quản trị Django - thay đổi danh sách thay đổi

Tôi đang cố gắng thay đổi danh sách kết quả (thay đổi danh sách trong django lingo) của một mô hình cụ thể bằng cách thêm hàng trung gian giữa các hàng kết quả (các hàng row1 và row2) có chứa một số đối tượng liên quan đến đối tượng đó.

Tôi đã tìm kiếm mã nhưng chưa tìm thấy cách để thực hiện việc này. Bất kỳ con trỏ nào cũng được đánh giá rất cao. Mã cũng sẽ giúp quá.

PS: Tôi biết tôi nên thiết kế giao diện của riêng mình, nhưng đây là một dự án nội bộ và tôi không có nhiều thời gian để rảnh rỗi. Ngoài ra, giao diện django là thực sự tốt đẹp.

Cảm ơn bạn trước.

+1

Có một số chức năng cho admin.py giúp bạn ghi đè các phương thức thông thường ... [Kiểm tra tại đây] (http://docs.djangoproject.com/en/dev/ref/contrib/admin/ # phương pháp khác) ... Chúng có thể giúp bạn ... – FallenAngel

Trả lời

27

Bước 1: Overriding xem danh sách thay đổi:
Bạn sẽ phải ghi đè lên một mẫu như trái ngược với cách xác định một mặt hàng như bạn có thể với add_view/change_view.

Điều đầu tiên trước tiên, ghi đè def changelist_view(self, request, extra_context=None): trong số ModelAdmin. Hãy nhớ gọi số super(foo, self).changelist_view(request, extra_context) và trả lại.

Bước 2: Trọng mẫu:
Tiếp theo, ghi đè lên các ứng dụng cụ thể mẫu danh sách thay đổi tại templates/admin/my_app/my_model/change_list.html (hay không .. bạn có thể sử dụng một danh sách thay đổi ghi đè lên toàn cầu quá nếu bạn muốn).

Bước 3: Sao chép danh sách kết quả chức năng
Tôi nghĩ rằng bạn có thể sao chép result_list chức năng (xác định một mẫu thẻ mới) hoặc giả nó bằng cách sao chép và dán chức năng result_list và mẫu bao gồm vào tầm nhìn của bạn.

# django.contrib.admin.templatetags.admin_list 
def result_list(cl): 
    """ 
    Displays the headers and data list together 
    """ 
    return {'cl': cl, 
      'result_hidden_fields': list(result_hidden_fields(cl)), 
      'result_headers': list(result_headers(cl)), 
      'results': list(results(cl))} 
result_list = register.inclusion_tag("admin/change_list_results.html")(result_list) 

Bạn có thể thấy quản trị viên sử dụng mẫu admin/change_list_results.html này để hiển thị các cột riêng lẻ, do đó bạn sẽ cần sử dụng một trong các phương pháp để thay thế thẻ mẫu này.

Vì tìm kiếm mẫu chung nên tôi sẽ không ghi đè lên.

Hoặc xác định thẻ mới với mẫu mới cụ thể cho chế độ xem của bạn hoặc gửi trực tiếp result_list(cl) mẫu của bạn và áp dụng trực tiếp admin/change_list_results.html để sử dụng trực tiếp trong mẫu change_list.html của bạn.

+1

Điều này hoạt động như một sự quyến rũ. Tôi đã phải gỡ lỗi các thuộc tính của cl trong result_list (cl) một chút. Khác hơn thế - cảm ơn rất lớn! :-) – Weholt

30

Để mở rộng về câu trả lời Yuji của, đây là một số chi tiết cụ thể về trọng change_list_results.html ...


Override changelist_view như mô tả ở trên trong bước 1, và cũng có thể được mô tả here at djangoproject. Hoặc tự động ghi đè bằng cách đặt trong thư mục thích hợp như trong bước 2 ở trên. (Lưu ý rằng đường dẫn bước 2 được hiển thị ở trên là mô hình cụ thể. Ứng dụng cụ thể sẽ là /admin/<MyAppName>/change_list.html trong bất kỳ thư mục nào được xác định trong bộ đệm TEMPLATE_DIRS.)

Hoặc (có lẽ dễ dàng hơn) chỉ cần xác định ModelAdmin.change_list_template như được giải thích here với bất kỳ phát hiện mẫu tên tập tin. (Mặc dù, nếu bạn giữ lại tên change_list.html, hãy chắc chắn không để gửi tiền trực tiếp vào thư mục /admin, khác tag extends sẽ gây ra một đệ quy.)

class MyModelAdmin(admin.ModelAdmin): 
    change_list_template = 'change_list.html' # definitely not 'admin/change_list.html' 
    # ... 

Trong mẫu change_list.html của bạn, có tối thiểu

{% extends "admin/change_list.html" %} 
{% load i18n admin_static admin_list %} 
{% load myapptags %} 

{% block result_list %} 
    {% if action_form and actions_on_top and cl.full_result_count %}{% admin_actions %}{% endif %} 
    {% result_list cl %} 
    {% if action_form and actions_on_bottom and cl.full_result_count %}{% admin_actions %}{% endif %} 
{% endblock %} 

Tạo một gói /<MyAppName>/templatetags (một thư mục chứa __init__.py) Với một tập tin tương ứng với thẻ nạp trên

# MyAppName/templatetags/myapptags.py 

from django import template 
from django.contrib.admin.templatetags.admin_list import result_list 

register = template.Library() 
register.inclusion_tag('my_change_list_results.html')(result_list) 

Sao chép và chỉnh sửa của Django change_list_results.html (như ví dụ my_change_list_results.html ở trên) để sử dụng chức năng bổ sung của bạn.

Lưu ý rằng các bước này không bao gồm ngữ cảnh bổ sung cho mẫu, nhưng có thể dễ dàng được mở rộng như vậy. (Lý do của tôi để làm điều này là để thêm các lớp học cho CSS và một hàng đầu <tbody> mà không được sắp xếp với danh sách kết quả.)


BỔ SUNG:

Để bao gồm bối cảnh thêm, thay đổi mô-đun templatetags của bạn như sau:

# MyAppName/templatetags/myapptags.py 

from django import template 
from django.contrib.admin.templatetags.admin_list import result_list as admin_list_result_list 

def result_list(cl): 
    mycl = {'myextracontext': 'something extra'} 
    mycl.update(foo_extra()) 
    mycl.update(admin_list_result_list(cl)) 
    return mycl 

register = template.Library() 
register.inclusion_tag('my_change_list_results.html')(result_list) 

sau đó, giá trị của myextracontext hoặc bất cứ điều gì foo_extra lợi nhuận có thể được đưa vào mẫu kết quả của bạn (như ví dụ {{ myextracontext }})

+0

Tôi không thể hiểu cấu trúc của câu trả lời này! – Pranab

Các vấn đề liên quan