Django Admin:动态添加内联

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django Admin:动态添加内联相关的知识,希望对你有一定的参考价值。

class MyTemplateAdmin(admin.ModelAdmin):
list_display = ('name')
search_fields = ['name']
inlines = [
    Template1Inline,
    Template2Inline,
    Template3Inline,
]

这很好用。但我需要的是让它充满活力。每当管理员向MyTemplate模型添加新模板时,都需要将其添加到内联中。

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

答案

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

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

希望能帮到你。

另一答案

在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类的模块。

另一答案

只是一个快速的想法。

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
        )
另一答案

我不完全确定这是你在找什么。您想要内联是同一模型的不同实例吗?动态创建内联的一种方法是使用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)
另一答案

只需覆盖管理员的get_inline_instances.

def get_inline_instances(self, request, obj=None):
    _inlines = super().get_inline_instances(request, obj=None)
    custom_inline = YourDynamicInline(self.model, self.admin_site)
    _inlines.append(custom_inline)
    return _inlines

以上是关于Django Admin:动态添加内联的主要内容,如果未能解决你的问题,请参考以下文章

Django Admin - 表格内联外键字段列表的动态值

Django Admin Cookbook-23如何在Django admin中添加嵌套的内联

Django Admin Cookbook-22如何将一对一关系添加为Admin内联字段

Django admin 不同的内联用于更改和添加视图

在 Django admin 中添加内联多对多对象

在 django admin 中为内联项目添加完整更改表单的链接?