特定のストーリーの管理サイトに基づいて、インラインを表示する必要がある状況がありました。
alekwisnia の回答を拡張すると、次のコードを使用して Django 1.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 が admin クラスの最初の構築中に、インライン クラスのリストに基づいてインライン インスタンスのリストをすでに構築しているためです。