2010-02-10 12 views
12

Ich brauche separate Ansichten für hinzufügen und Seite ändern. Auf der Seite möchte ich einige Felder vom Inline-Formset ausschließen. Ich habe zwei TabularInline-Klassen vorbereitet, von denen eine die Eigenschaft 'exclude' enthält. Ich habe versucht, sie wie folgt zu verwenden:Django Admin verschiedene Inlines für Änderung und hinzufügen

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) 

ohne Wirkung (keine Inline wird überhaupt angezeigt).

Antwort

1

Warum in add_view haben Sie .add_view(self, request) und in der Änderungsansicht haben Sie .change_view(self.request, ..)? Ich glaube, du brauchst kein Selbst in add_view, da du super verwendest.

7

Hier ist der Code, scheint zu funktionieren:

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) 

Dies ist jedoch diesen Teil unelegant, verursachen aussieht:

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

ist ein copy-paste von init Methode admin .ModelAdmin (wird also zweimal ausgeführt).

15

Es arbeitet mit Django 1.5+ und scheint gut & elegant:

// 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) 

hoffen, dass es irgendjemand für nützlich sein kann

+1

Ich benutzte es wörtlich und es funktioniert Django, ich aber die beiden kehrt mit 'Rückkehr Super ersetzt (boxadmin, Selbst-) .change_view (Anfrage, object_id, FORM_URL, extra_context)' und 'return super (BoxAdmin, self) .add_view (request, form_url, extra_context)' –

0

hatte ich eine Situation, wo ich eine Inline zeigen benötigen basierend auf der Admin-Seite dass du für eine bestimmte Geschichte warst.

Erweiterung auf alekwisnia Antwort konnte ich dynamischen inlines für Django arbeiten erhalten 1.3 mit dem folgenden Code:

In Highlights/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) 

In Geschichte/admin. py

class StoryAdmin(HighlightAdmin): 

Eines ist zu beachten, dass ich nicht nur die Manipulation in Line-Klassen (HighlightInline), sondern ich ändere Inline-Instanzen (HighlightInline (self.model, self.admin_site)). Dies liegt daran, dass Django bereits eine Liste von Inline-Instanzen erstellt hat, die auf einer Liste von Inline-Klassen während der anfänglichen Konstruktion der Admin-Klasse basiert.

0

Eine andere Lösung 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)