2010-02-10 7 views
12

Tôi cần có các chế độ xem riêng biệt để thêm và thay đổi trang. Trong trang thêm, tôi muốn loại trừ một số trường từ bộ định dạng nội tuyến. Tôi đã chuẩn bị hai lớp TabularInline, một trong số chúng chứa thuộc tính 'exclude'. Tôi đã cố gắng sử dụng chúng như sau:Django quản trị nội tuyến khác nhau cho thay đổi và thêm xem

class BoxAdmin(admin.ModelAdmin): 
    def change_view(self, request, obj_id): 
     self.inlines=[ItemChangeInline,] 
     return super(BoxAdmin, self).change_view(self.request, obj_id) 
    def add_view(self, request): 
     self.inlines=[ItemAddInline,] 
     return super(BoxAdmin, self).add_view(self, request) 

không có hiệu lực (không hiển thị nội tuyến).

Trả lời

1

Tại sao trong add_view bạn có .add_view(self, request) và trong chế độ xem thay đổi, bạn có .change_view(self.request, ..)? Tôi tin rằng, bạn không cần tự trong add_view, kể từ khi bạn sử dụng siêu.

7

Đây là mã mà dường như được làm việc:

class BoxAdmin(admin.ModelAdmin): 
    def change_view(self, request, obj_id): 
     self.inlines=[ItemChangeInline,] 
     for inline_class in self.inlines: 
      inline_instance = inline_class(self.model, self.admin_site) 
      self.inline_instances.append(inline_instance) 
     return super(BoxAdmin, self).change_view(request, obj_id) 
    def add_view(self, request): 
     self.inlines=[ItemAddInline,] 
     for inline_class in self.inlines: 
      inline_instance = inline_class(self.model, self.admin_site) 
      self.inline_instances.append(inline_instance) 
     return super(BoxAdmin, self).add_view(request) 

Tuy nhiên, điều này có vẻ không thanh nha, gây ra phần này:

  for inline_class in self.inlines: 
      inline_instance = inline_class(self.model, self.admin_site) 
      self.inline_instances.append(inline_instance) 

là một copy-paste từ init phương pháp quản trị .ModelAdmin (vì vậy nó được chạy hai lần).

15

Nó hoạt động với Django 1.5+ và có vẻ tốt đẹp & thanh lịch:

// admin.py 
class BoxAdmin(ModelAdmin): 

    inlines =() 

    def change_view(self, request, object_id, form_url='', extra_context=None): 
     self.inlines = (ItemChangeInline,) 
     return super(BoxAdmin, self).change_view(request, object_id) 

    def add_view(self, request, form_url='', extra_context=None): 
     self.inlines = (ItemAddInline,) 
     return super(BoxAdmin, self).add_view(request) 

hy vọng nó có thể hữu ích cho bất cứ ai

+1

tôi đã sử dụng nó đúng nguyên văn và nó hoạt động, tôi đã thay thế mặc dù hai trở lại với 'trở lại siêu (BoxAdmin, tự) .change_view (yêu cầu, object_id, form_url, extra_context)' và 'return super (BoxAdmin, self) .add_view (yêu cầu, form_url, extra_context)' –

0

tôi đã có một tình huống mà tôi cần phải hiển thị một Inline dựa trên site admin mà bạn đang ở trong một câu chuyện cụ thể.

Mở rộng về câu trả lời alekwisnia, tôi đã có thể để có được inlines động làm việc cho Django 1.3 sử dụng đoạn mã sau:

Trong nổi bật/admin.py

class HighlightInline(generic.GenericTabularInline): 
    model = Highlight 
    extra = 1 
    max_num = 4 
    fields = ('order', 'highlight') 
    template = 'admin/highlights/inline.html' 

class HighlightAdmin(admin.ModelAdmin): 
    def regulate_highlight_inlines(self): 
     highlights_enabled = Setting.objects.get_or_default('highlights_enabled', default='') 
     highlight_inline_instance = HighlightInline(self.model, self.admin_site) 
     highlight_found = any(isinstance(x, HighlightInline) for x in self.inline_instances) 
     if highlights_enabled.strip().lower() == 'true': 
      if not highlight_found: 
       self.inline_instances.insert(0, highlight_inline_instance) 
     else: 
      if highlight_found: 
       self.inline_instances.pop(0) 
     print self.inline_instances 

    def change_view(self, request, object_id, form_url='', extra_context=None): 
     self.regulate_highlight_inlines() 
     return super(HighlightAdmin, self).change_view(request, object_id) 

    def add_view(self, request, form_url='', extra_context=None): 
     self.regulate_highlight_inlines() 
     return super(HighlightAdmin, self).add_view(request, form_url, extra_context) 

Trong câu chuyện/admin. py

class StoryAdmin(HighlightAdmin): 

Điều cần lưu ý là tôi không chỉ thao túng trong các lớp dòng (HighlightInline) nhưng thay vào đó, tôi đang thay đổi các cá thể nội tuyến (HighlightInline (self.model, self.admin_site)). Điều này là do django đã xây dựng một danh sách các cá thể nội tuyến dựa trên danh sách các lớp nội tuyến trong quá trình xây dựng ban đầu của lớp quản trị.

0

Một giải pháp khác để Django 1,3

class BoxAdmin(admin.ModelAdmin): 

    def change_view(self, request, object_id, form_url='', extra_context=None): 
     self.inline_instances = [ItemChangeInline(self.model, self.admin_site)] 
     return super(BoxAdmin, self).change_view(request, object_id, extra_context) 

    def add_view(self, request, form_url='', extra_context=None): 
     self.inline_instances = [ItemAddInline(self.model, self.admin_site)] 
     return super(BoxAdmin, self).add_view(request, form_url, extra_context)