- January 5, 2009
- mixin modeladmin
- 0 (after 0 ratings)
There are several nice ModelAdmin subclasses that provide useful functionality (such as django-batchadmin, django-reversion, and others), but unfortunately a ModelAdmin can really only subclass one at a time, making them mutually exclusive.
This snippet aims to make mixing these classes in as easy as possible -- you can inherit your model admin from it, add a tuple of mixins, and it will dynamically change the inheritance tree to match. This isn't guaranteed to work with all ModelAdmins, but so long as the mixins play nice with django modeladmin they should work.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
def generate_mixin_chain(self): mixins =  cursor = self.__class__ while cursor is not ModelAdmin and cursor is not None: if hasattr(cursor, 'mixins'): mixins += [mixin for mixin in cursor.mixins if mixin not in mixins] cursor = cursor.__base__ mixin_len = len(mixins) if mixin_len > 0: for index, mixin in enumerate(mixins): target = ModelAdmin if index != (mixin_len-1): target = mixins[index+1] mixin.__bases__ = (target,) MixinModelAdmin.__bases__ = (mixins,) # example usage: class MyModelAdmin(MixinModelAdmin): """ The resultant inheritance tree will look like so: ModelAdmin DispatchableModelAdmin WidgetModelAdmin MixinModelAdmin MyModelAdmin where ModelAdmins subclass the ModelAdmin directly above them. """ mixins = (WidgetModelAdmin, DispatchableModelAdmin, )