Django Admin:动态添加内联

发布于 2024-10-31 02:38:22 字数 319 浏览 5 评论 0原文

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

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

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

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

This works fine. But what I need is to make it dynamic. Whenever the admin adds a new Template to the MyTemplate Model, that needs to be added to the inlines.

Is there a way to do this? Please comment if I am not clear enough on my question.
Thanks in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

夏末染殇 2024-11-07 02:38:22

只需覆盖管理员的 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

Just Override the admin's 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
江湖正好 2024-11-07 02:38:22

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

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

希望对你有帮助。

I haven't tested this, but in theory you could do:

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

Hope that helps you out.

诠释孤独 2024-11-07 02:38:22

在模板的 admin.py 中:

class Template1Inline(admin.TabularInline)
  pass

class Template2Inline(admin.TabularInline)
  pass

然后在 MyTemplateAdmin 的 admin.py 中:

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 类。

In admin.py for the Templates:

class Template1Inline(admin.TabularInline)
  pass

class Template2Inline(admin.TabularInline)
  pass

Then in the admin.py for 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 may not be correct depending on how you have your project setup, but the point is you just import the module that has the Template1Inline classes.

那小子欠揍 2024-11-07 02:38:22

只是一个快速的想法。

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
        )

Just a quick idea.

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
        )
女皇必胜 2024-11-07 02:38:22

我不完全确定这就是您正在寻找的东西。您想要内联是同一模型的不同实例吗?
动态创建内联的一种方法是使用 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)

I'm not completely sure this is what you are looking for. You want inlines that are different instances of the same model?
One way of creating the inlines dynamically is with type() and adding them in 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)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文