Python Django管理员:动态添加内联线
这个很好用。但我需要的是让它充满活力。每当管理员向MyTemplate模型添加新模板时,都需要将其添加到内联 有办法做到这一点吗?如果我对我的问题不够清楚,请发表评论。Python Django管理员:动态添加内联线,python,django,django-models,django-admin,Python,Django,Django Models,Django Admin,这个很好用。但我需要的是让它充满活力。每当管理员向MyTemplate模型添加新模板时,都需要将其添加到内联 有办法做到这一点吗?如果我对我的问题不够清楚,请发表评论。 提前谢谢 我还没有测试过,但理论上你可以: class MyTemplateAdmin(admin.ModelAdmin): list_display = ('name') search_fields = ['name'] inlines = [ Template1Inline, Template2Inline,
提前谢谢 我还没有测试过,但理论上你可以:
class MyTemplateAdmin(admin.ModelAdmin):
list_display = ('name')
search_fields = ['name']
inlines = [
Template1Inline,
Template2Inline,
Template3Inline,
]
希望对您有所帮助。在admin.py中查看模板:
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']
然后在MyTemplateAdmin的admin.py中:
class Template1Inline(admin.TabularInline)
pass
class Template2Inline(admin.TabularInline)
pass
Templates.admin
可能不正确,这取决于您的项目设置方式,但关键是您只需导入包含Template1Inline
类的模块。简单介绍一下
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)
我不完全确定这就是你要找的。是否希望内联线是同一模型的不同实例? 动态创建内联线的一种方法是使用type()并将它们添加到get_inline_instances()中
只需覆盖管理员的
这里的内联线不是局部变量吗?它不应该改变任何东西,你是说self.inlines吗?很好!它起作用了!
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
)
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)
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