特定のストーリーでアクセスしていた管理サイトに基づいてインラインを表示する必要がある状況がありました。
次のコードを使用して、Django1.3で動的インラインを機能させることができました。
ハイライト/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):
注意すべき点の1つは、インラインクラス(HighlightInline)を操作しているだけでなく、インラインインスタンス(HighlightInline(self.model、self.admin_site))を変更していることです。これは、管理クラスの初期構築時に、djangoがインラインクラスのリストに基づいてインラインインスタンスのリストをすでに構築しているためです。