from wagtail.admin.edit_handlers import FieldPanel from wagtail.admin.edit_handlers import MultiFieldPanel from wagtail.admin.edit_handlers import ObjectList from wagtail.contrib.modeladmin.options import ModelAdmin class DynamicPanelMixin: def get_edit_handler(self, instance, request): return ObjectList(self._get_panels(instance)) def _get_panels(self, instance): return [ *self._get_head_panels(instance), MultiFieldPanel( self._get_multi_panels(instance), heading="Collapsed", classname="collapsible collapsed", ), ] def _get_head_panels(self, instance): panels = [ FieldPanel("foo"), ] return panels + getattr(instance, "head_panels", []) def _get_multi_panels(self, instance): panels = [ FieldPanel("bar"), ] return panels + getattr(instance, "multi_panels", []) # class MyModelAdmin(DynamicPanelMixin, ModelAdmin): # pass