2010-02-10 21 views
12

Potrzebuję osobnych widoków do dodania i zmiany strony. Na stronie dodawania chciałbym wykluczyć niektóre pola z wbudowanego formularza. Przygotowałem dwie klasy TabularInline, z których jedna zawiera właściwość "wyklucz". Próbowałem ich użyć w następujący sposób:Administrator Django różne linie wprowadzania zmian i dodawanie widoku

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) 

bez efektu (w ogóle nie pokazuje się linii).

Odpowiedz

1

Dlaczego w add_view masz .add_view(self, request) iw widoku zmiany masz .change_view(self.request, ..)? Wierzę, że nie potrzebujesz self w add_view, ponieważ używasz super.

7

Oto kod, który wydaje się działać:

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) 

Jednak wygląda to nieeleganckie, bo ten fragment:

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

to copy-paste z init, metoda admin .ModelAdmin (więc jest uruchamiany dwa razy).

15

Współpracuje z Django 1.5+ i wydaje się dobrze & elegancki:

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

nadzieję, że może to być przydatne dla każdego

+1

Kiedyś to verbatim i działa, chociaż wymieniłem dwa powroty z 'powrócić super (BoxAdmin, self) .change_view (wniosek, object_id, adresu FORM_URL, extra_context)' i 'return super (BoxAdmin, self) .add_view (request, form_url, extra_context)' –

0

miałem sytuację, w której musiałem pokazać inline oparte na stronie administratora że byłeś na danej historii.

Rozwijając na odpowiedź alekwisnia za, udało mi się dostać dynamicznych inlines pracujących dla Django 1.3 za pomocą następującego kodu:

w rozjaśnionych/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) 

Story/admin. py

class StoryAdmin(HighlightAdmin): 

Należy pamiętać, że nie tylko manipuluję klas liniowych (HighlightInline), ale raczej zmieniam inline instances (HighlightInline (self.model, self.admin_site)). Dzieje się tak dlatego, że django zbudował już listę instancji wbudowanych na podstawie listy klas wbudowanych podczas początkowej budowy klasy admin.

0

Innym rozwiązaniem 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) 
Powiązane problemy