Django Admin多重继承类仅生效首个类功能,如何同时启用两类功能?
解决Django Admin同时启用MPTTModelAdmin和DjangoObjectActions功能的问题
问题核心是两个父类均重写了changelist_view方法,默认多重继承逻辑下仅会执行排在前面的类的方法,导致另一类功能失效。可通过以下两种方式解决:
方法一:调整继承顺序
将DjangoObjectActions放在继承列表最前端,它的changelist_view方法会主动调用super()触发后续父类(MPTTModelAdmin)的对应方法,从而同时保留两类功能:
from django.contrib import admin from mptt.admin import MPTTModelAdmin from .models import Category, Image from django_object_actions import DjangoObjectActions, action from scripts.load_csv_to_db import run class CategoryAdmin(DjangoObjectActions, MPTTModelAdmin): @action(label='Load data') def load_data(self, request, queryset): run() changelist_actions = ('load_data', ) admin.site.register(Category, CategoryAdmin) admin.site.register(Image)
方法二:手动合并上下文逻辑
若调整顺序后仍有异常,可在自定义Admin类中重写changelist_view,手动注入DjangoObjectActions所需的上下文,再调用MPTTModelAdmin的处理逻辑:
from django.contrib import admin from mptt.admin import MPTTModelAdmin from .models import Category, Image from django_object_actions import DjangoObjectActions, action from scripts.load_csv_to_db import run class CategoryAdmin(MPTTModelAdmin, DjangoObjectActions): @action(label='Load data') def load_data(self, request, queryset): run() changelist_actions = ('load_data', ) def changelist_view(self, request, extra_context=None): # 添加DjangoObjectActions所需的上下文数据 extra_context = extra_context or {} extra_context['django_object_actions'] = self.get_changelist_actions(request) # 调用MPTTModelAdmin的changelist_view完成拖拽功能渲染 return super().changelist_view(request, extra_context) admin.site.register(Category, CategoryAdmin) admin.site.register(Image)
两种方法均能让管理面板同时显示MPTT的实体拖拽功能和DjangoObjectActions的"Load data"按钮。
内容的提问来源于stack exchange,提问作者Ilia Korepanov
相关产品推荐
相关产品推荐

