2013-07-31 45 views
17

Tôi đang làm việc trên Dự án Django, nơi tôi cần trích xuất danh sách người dùng thành excel từ Màn hình Người dùng của Quản trị viên Django. Tôi đã thêm actions biến vào Lớp mẫu của mình để nhận Hộp kiểm trước id của từng người dùng.Cách thêm nút bên cạnh nút Thêm Người dùng trong Trang web Quản trị Django

class SampleClass(admin.ModelAdmin): 
    actions =[make_published] 

Hành động make_published đã được xác định. Bây giờ tôi muốn nối thêm một nút khác bên cạnh nút Add user như trong hình. Admin User Screen. Nhưng tôi không biết làm thế nào tôi có thể đạt được điều này với việc sử dụng mẫu mới. Tôi muốn sử dụng nút đó để in dữ liệu người dùng đã chọn để vượt trội. Cảm ơn, xin vui lòng hướng dẫn tôi.

Trả lời

28
  1. Tạo một mẫu trong thư mục bạn mẫu: admin/YOUR_APP/YOUR_MODEL/change_list.html
  2. Đặt này vào mẫu mà

    {% extends "admin/change_list.html" %} 
    {% block object-tools-items %} 
    
        {{ block.super }} 
    
        <li> 
         <a href="export/" class="grp-state-focus addlink">Export</a> 
        </li> 
    
    {% endblock %} 
    
  3. Tạo một chức năng xem trong YOUR_APP/admin.py và an toàn bằng chú thích

    from django.contrib.admin.views.decorators import staff_member_required 
    
    @staff_member_required 
    def export(self, request): 
    
        ... do your stuff ... 
    
        return HttpResponseRedirect(request.META["HTTP_REFERER"]) 
    
  4. Thêm url mới vào YOUR_APP/admin.py để ur l cấu hình cho mô hình quản trị

    from django.conf.urls import patterns, include, url 
    
    class YOUR_MODELAdmin(admin.ModelAdmin): 
    
        ... list def stuff ... 
    
        def get_urls(self): 
         urls = super(MenuOrderAdmin, self).get_urls() 
         my_urls = patterns("", 
          url(r"^export/$", export) 
         ) 
         return my_urls + urls 
    

Thưởng thức;)

+0

tôi theo dõi cho đến khi phần cuối cùng, mà là url (r "^ tài chính xuất/$) đến từ đâu? –

+0

Liên kết của bạn có hai thuộc tính 'class':' class = "grp-state-focus" class = "addlink" ' – Nick

+0

Cảm ơn bạn, fixedd. – grafa

0

Các dễ dàngchấp nhận cách là ghi đè mẫu.

Nếu bạn không muốn gây rối với các mẫu Django, bạn có thể thêm lớp Media vào quản trị viên của mình và thêm một số javascript để tạo nút mặc dù tôi nghĩ rằng việc tạo các phần tử với javascript hơi khó chịu và cần tránh.

1

Mặc dù câu trả lời khác là hoàn toàn hợp lệ, tôi nghĩ rằng điều quan trọng là cần lưu ý rằng nó là hoàn toàn không cần thiết phải thêm một nút để có được hành vi như vậy . Bạn có thể sử dụng các tác vụ quản trị, như bạn đã làm cho hành động make_published.

Đây là lợi thế của việc không đòi hỏi phải ghi đè lên bất kỳ mẫu nào, và do đó ngăn ngừa những rắc rối tiềm năng khi nâng cấp phiên bản django (vì mẫu quản trị viên có thể thay đổi và thay đổi có thể không tương thích với cách bạn đã khắc phục).

import csv 

from django.http import HttpResponse 
from django.utils import timezone 

def export_as_csv(modeladmin, request, queryset): 
    opts = modeladmin.model._meta 
    filename = format(timezone.now(), "{app}_{model}-%Y%m%d_%H%M.csv").format(
     app=opts.app_label, model=opts.model_name) 

    response = HttpResponse(content_type='text/csv') 
    response['Content-Disposition'] = 'attachment; filename="{}"'.format(filename) 

    writer = csv.writer(response) 
    field_names = [f.get_attname() for f in opts.concrete_fields] 
    writer.writerow(field_names) 
    for obj in queryset.only(*field_names): 
     writer.writerow([str(getattr(obj, f)) for f in field_names]) 

    return response 

Hành động quản trị được thực hiện cho việc này, thêm nút tùy chỉnh là một bước gần hơn "quá tùy chỉnh", có nghĩa là đã đến lúc viết chế độ xem của riêng bạn.

Quản trị viên có nhiều móc để tùy chỉnh, nhưng hãy cẩn thận khi cố sử dụng các móc đó một cách độc quyền. Nếu bạn cần cung cấp một giao diện trung tâm xử lý hơn để tóm tắt các chi tiết thực hiện của các bảng và các trường cơ sở dữ liệu, thì có lẽ là lúc để viết các khung nhìn của riêng bạn.

Trích từ introduction paragraph of Django Admin's documentation

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