2015-10-29 12 views
7

Có cách nào để tạo tùy chọn list_editable trên một cơ sở đối tượng không? Ví dụ: thuộc tính trường chỉ đọc có tùy chọn này, tùy chọn này không ảnh hưởng đến changelist_view.Quản trị viên có điều kiện Django list_editable

class MyAdmin(admin.ModelAdmin): 
    readonly_fields = ('foo',) 

    def get_readonly_fields(self, request, obj=None): 
     fields = super(MyAdmin, self).get_readonly_fields(request, obj=obj) 

     if obj.status == 'CLOSED': 
      return fields + ('bar',) 
     return fields 

Điều tương tự cũng có thể đạt được đối với danh sách hiển thị và một số thuộc tính khác. Có vẻ như không có phương thức 'get_list_editable_fields'.

Tôi muốn một số hàng không thay đổi rõ ràng, nhưng ngoài việc đưa ra lỗi thô tục thì dường như không hoạt động. Tôi không tìm thấy bất kỳ tài liệu nào về thuộc tính hoặc là

Có thể nào đó bằng cách nào đó có thể hiển thị tiện ích con thông qua trình lấy lại list_display không?

class MyAdmin(admin.ModelAdmin): 
    list_display = ('get_bar',) 
    list_editable = ('get_bar',) 

    def get_bar(self, obj): 
     return widget or str(obj.bar) # ??? 
    get_bar.allow_tags = True 

cập nhật sử dụng phản hồi Alasdair của:

def get_changelist_formset(self, request, **kwargs): 
    """ 
    Returns a FormSet class for use on the changelist page if list_editable 
    is used. 
    """ 
    # I run through this code for each row in the changelist, but there's nothing in kwargs, so I don't know how to use the instance as a guide to which fields should be in list_editable? 

    defaults = { 
     "formfield_callback": partial(self.formfield_for_dbfield, request=request), 
    } 
    defaults.update(kwargs) 
    return modelformset_factory(
     self.model, self.get_changelist_form(request), extra=0, 
     fields=self.list_editable, **defaults 
    ) 

Trả lời

1

Như bạn nói, không có phương pháp get_list_editable.

Thử ghi đè phương thức get_changelist_formset. Tôi nghĩ bạn sẽ cần phải sao chép toàn bộ phương thức và thay đổi danh sách các trường được chuyển đến modelformset_factory.

+0

Tôi không hiểu làm thế nào để có được những ví dụ hiện tại trong phương pháp này, tôi chạy qua các phương pháp cho mỗi hàng, nhưng kwargs là trống? xem câu hỏi được cập nhật của tôi – trb

+0

Tôi không chắc chắn câu trả lời là gì, bạn khá sâu bên trong mã quản trị! Bạn có thể cần phải ghi đè 'get_changelist_form' cũng như/thay thế. Chúc may mắn! – Alasdair

+0

Điều này đặt tôi đi đúng hướng .. Tôi đã đăng ký mô hình trên quản trị hai lần (yêu cầu một mô hình proxy hack) và tạo bộ quy tắc quản trị viên của riêng nó. Yêu cầu này thực sự chạm đến các ranh giới của quản trị django :-) – trb

0

Ngoài ra, bạn có thể ghi đè lên changelist_view và làm điều gì đó như thế:

def changelist_view(self, request, extra_context=None): 
     resp = super(CustomModelAdmin, self).changelist_view(request, extra_context) 
     if something: 
      resp.context_data['cl'].formset = None 

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