2010-02-10 7 views
12

Necesito vistas separadas para agregar y cambiar página. En la página de agregar me gustaría excluir algunos campos del formset en línea. He preparado dos clases de TabularInline, una de ellas contiene la propiedad 'excluir'. Intenté usarlos de la siguiente manera:Django admin diferentes líneas para el cambio y agregar vista

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) 

sin efecto (no se muestra en línea).

Respuesta

1

¿Por qué en add_view usted tiene .add_view(self, request) y en cambio tiene .change_view(self.request, ..)? Creo que no necesitas self en add_view, ya que usas super.

7

Este es el código que parece estar funcionando:

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) 

Sin embargo, esto parece poco elegante, causa esta parte:

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

es un copiar y pegar desde init método de administración .ModelAdmin (por lo que se ejecuta dos veces).

15

Funciona con Django 1.5 + y parece estar bien & elegante:

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

espero que pueda ser útil para cualquier persona

+1

utilicé pie de la letra y funciona, aunque he sustituido las dos vueltas con 'súper volver (boxadmin, auto) .change_view (solicitud, object_id, FORM_URL, extra_context)' y 'return super (BoxAdmin, self) .add_view (request, form_url, extra_context)' –

0

que tenía una situación en la que tenía que mostrar una línea base en el sitio de administración que estabas en una historia dada.

Ampliando la respuesta de alekwisnia, yo era capaz de conseguir inlines dinámicas de trabajo de Django 1.3 usando el siguiente código:

En aspectos más destacados/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) 

En la historia/admin. py

class StoryAdmin(HighlightAdmin): 

Una cosa a tener en cuenta es que no estoy simplemente manipulando en clases de línea (HighlightInline), sino más bien, estoy cambiando las instancias en línea (HighlightInline (self.model, self.admin_site)). Esto se debe a que django ya ha creado una lista de instancias en línea basadas en una lista de clases en línea durante la construcción inicial de la clase de administrador.

0

Otra solución a 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) 
Cuestiones relacionadas