Tuve una situación en la que necesitaba mostrar una Inline basada en el sitio de administración en el que estaba para una historia determinada.
que era capaz de conseguir inlines dinámicas de trabajo de Django 1.3 utilizando 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 meramente manipulando las clases en 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.
Funciona sin problemas. Gracias. –
Esto no funciona desde Django 1.4. '__init__' ya no parece crear self.inline_instances, pero ahora hay un método get_inline_instances() que puedes anular explícitamente. – Cerin
Parece que el comentario de Cerin está desactualizado ya que esta respuesta se ha modificado para usar get_inline_instances –