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

这工作正常。但我需要的是让它变得动态。每当管理员添加新模板到MyTemplate模型时,都需要将其添加到内联。Django Admin:动态添加内联

有没有办法做到这一点?如果我对我的问题不够清楚,请发表评论。 在此先感谢!

回答

0

我没有测试过这一点,但在理论上你可以这样做:

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'] 

希望有所帮助你。

0

在admin.py的模板:

class Template1Inline(admin.TabularInline) 
    pass 

class Template2Inline(admin.TabularInline) 
    pass 

然后在admin.py为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可能不正确取决于你如何有你的项目设置,但重点是您只需导入具有Template1Inline类的模块。

0

只是一个快速的想法。

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

我不完全确定这是你在找什么。你想要内联是同一个模型的不同实例吗? 一种动态创建内联的方法是使用type()并将它们添加到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)