2011-04-06 5 views
2
class MyTemplateAdmin(admin.ModelAdmin): 
list_display = ('name') 
search_fields = ['name'] 
inlines = [ 
    Template1Inline, 
    Template2Inline, 
    Template3Inline, 
] 

Cela fonctionne très bien. Mais ce dont j'ai besoin, c'est de le rendre dynamique. Chaque fois que l'administrateur ajoute un nouveau modèle au modèle MyTemplate, il doit être ajouté aux inlines.Django Admin: ajouter des lignes dynamiques dynamiquement

Existe-t-il un moyen de le faire? Veuillez commenter si je ne suis pas assez clair sur ma question. Merci d'avance!

Répondre

0

Je ne l'ai pas testé, mais en théorie, vous pourriez faire:

class MyTemplateAdmin(admin.ModelAdmin): 
    def __init__(self, *args, **kwargs): 
     super(MyTemplateAdmin, self).__init__(*args, **kwargs) 
     #see if there are new templates 
     #and set the inlines list property 

    list_display = ('name') 
    search_fields = ['name'] 

espoir que vous aide.

0

En admin.py pour les modèles:

class Template1Inline(admin.TabularInline) 
    pass 

class Template2Inline(admin.TabularInline) 
    pass 

Ensuite, dans le admin.py pour MyTemplateAdmin:

import sys, inspect, Templates.admin 
class MyTemplateAdmin(admin.ModelAdmin): 
    list_display = ('name') 
    search_fields = ['name'] 

    def __init__(self, *args, **kwargs): 
    inlines = [class_type[1] for class_type in inspect.getmembers(Templates.admin, inspect.isclass)] 
    super(MyTemplateAdmin, self).__init__(*args, **kwargs) 

Templates.admin peut ne pas être correcte en fonction de la façon dont vous avez la configuration de votre projet, mais le point est que vous venez d'importer le module qui a les classes Template1Inline.

0

Juste une petite idée.

from django.contrib import admin 
from mymodule import signals 

class MyModuleAdmin(admin.ModelAdmin): 

    def add_view(self, *args, **kwargs): 
     signals.my_dynamic_inline_hook_signal.send(
      sender = self, 
      inlines = self.inlines, 
      args = args, 
      kwargs = kwargs 
     ) 
0

Je ne suis pas complètement sûr que ce soit ce que vous cherchez. Vous voulez des inlines qui sont différentes instances du même modèle? Une façon de créer les inlines dynamiquement est avec type() et de les ajouter dans get_inline_instances()

class MyTemplateAdmin(admin.ModelAdmin): 
    list_display = ('name') 
    search_fields = ['name'] 
    inlines = [some_other_inline] 

    def get_inline_instances(self, request, obj=None): 
     new_inlines = [] 
     for inline in (Template, Template2,Template3, ...): # I don't know how you want to get these. 
      attrs = { 
       'model': MyTemplate, 
       # 'extra': 1, Add extra attributes 
      } 
      # Create a new uninstanciated inline class 
      new_inlines.append(type('{}Inline'.format(inline), 
             (admin.TabularInline,), attrs)) 

     # Add the dynamically created inlines along with the ordinary. 
     self.inlines = self.inlines + new_inlines 
     return super(CommunityAdmin, self).get_inline_instances(request, obj) 
Questions connexes