Skip to content

Commit ce8f99d

Browse files
committed
fix #304: SortableInlineAdminMixin works with SortableInlineAdminBase
1 parent 0d050d9 commit ce8f99d

File tree

4 files changed

+58
-23
lines changed

4 files changed

+58
-23
lines changed

adminsortable2/admin.py

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,26 @@ def media(self):
6565
js = ['adminsortable2/js/adminsortable2.min.js']
6666
return super().media + widgets.Media(css=css, js=js)
6767

68+
def get_formset_kwargs(self, request, obj, inline, prefix):
69+
formset_params = super().get_formset_kwargs(request, obj, inline, prefix)
70+
if hasattr(inline, 'default_order_direction') and hasattr(inline, 'default_order_field'):
71+
formset_params.update(
72+
default_order_direction=inline.default_order_direction,
73+
default_order_field=inline.default_order_field,
74+
)
75+
return formset_params
76+
77+
def get_inline_formsets(self, request, formsets, inline_instances, obj=None):
78+
inline_admin_formsets = super().get_inline_formsets(request, formsets, inline_instances, obj)
79+
for inline_admin_formset in inline_admin_formsets:
80+
if hasattr(inline_admin_formset.formset, 'default_order_direction'):
81+
classes = inline_admin_formset.classes.split()
82+
classes.append('sortable')
83+
if inline_admin_formset.formset.default_order_direction == '-':
84+
classes.append('reversed')
85+
inline_admin_formset.classes = ' '.join(classes)
86+
return inline_admin_formsets
87+
6888

6989
class SortableAdminMixin(SortableAdminBase):
7090
BACK, FORWARD, FIRST, LAST, EXACT = range(5)
@@ -391,26 +411,6 @@ def get_update_url(self, request):
391411
"""
392412
return reverse(f'{self.admin_site.name}:{self._get_update_url_name()}')
393413

394-
def get_formset_kwargs(self, request, obj, inline, prefix):
395-
formset_params = super().get_formset_kwargs(request, obj, inline, prefix)
396-
if hasattr(inline, 'default_order_direction') and hasattr(inline, 'default_order_field'):
397-
formset_params.update(
398-
default_order_direction=inline.default_order_direction,
399-
default_order_field=inline.default_order_field,
400-
)
401-
return formset_params
402-
403-
def get_inline_formsets(self, request, formsets, inline_instances, obj=None):
404-
inline_admin_formsets = super().get_inline_formsets(request, formsets, inline_instances, obj)
405-
for inline_admin_formset in inline_admin_formsets:
406-
if hasattr(inline_admin_formset.formset, 'default_order_direction'):
407-
classes = inline_admin_formset.classes.split()
408-
classes.append('sortable')
409-
if inline_admin_formset.formset.default_order_direction == '-':
410-
classes.append('reversed')
411-
inline_admin_formset.classes = ' '.join(classes)
412-
return inline_admin_formsets
413-
414414

415415
class PolymorphicSortableAdminMixin(SortableAdminMixin):
416416
"""
@@ -474,10 +474,14 @@ class CustomInlineFormSet(CustomInlineFormSetMixin, BaseInlineFormSet):
474474
pass
475475

476476

477-
class SortableInlineAdminMixin(SortableAdminBase):
477+
class SortableInlineAdminMixin:
478478
formset = CustomInlineFormSet
479479

480480
def __init__(self, parent_model, admin_site):
481+
assert isinstance(admin_site._registry[parent_model], SortableAdminBase), \
482+
"{} must inherit from SortableAdminBase since {} inherits from SortableInlineAdminMixin.".format(
483+
admin_site._registry[parent_model], self.__class__.__name__
484+
)
481485
self.default_order_direction, self.default_order_field = _get_default_ordering(self.model, self)
482486
super().__init__(parent_model, admin_site)
483487

docs/source/usage.rst

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,20 @@ we simple use the mixin class :class:`adminsortable2.admin.SortableAdminMixin`.
152152
...
153153
inlines = [ChapterStackedInline]
154154
155-
For stacked inlines the editor for the book's detail view looks like:
155+
In case model ``Chapter`` shall be sortable, but model ``Book`` doesn't have to, rewrite the above
156+
class as:
157+
158+
.. code-block:: python
159+
160+
...
161+
from adminsortable2.admin import SortableAdminBase
162+
163+
@admin.register(Book)
164+
class SortableBookAdmin(SortableAdminBase, admin.ModelAdmin):
165+
...
166+
inlines = [ChapterStackedInline]
167+
168+
For stacked inlines, the editor for the book's detail view looks like:
156169

157170
.. image:: _static/stacked-inline-view.png
158171
:width: 800

testapp/admin.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from django.contrib import admin
22

3-
from adminsortable2.admin import SortableAdminMixin, SortableInlineAdminMixin
3+
from adminsortable2.admin import SortableAdminBase, SortableAdminMixin, SortableInlineAdminMixin
44

55
from . import models
66

@@ -51,8 +51,15 @@ class OrderedSortableBookAdmin(SortableBookAdmin):
5151
ordering = ['my_order']
5252

5353

54+
class UnsortedBookAdmin(SortableAdminBase, admin.ModelAdmin):
55+
list_per_page = 12
56+
list_display = ['title', 'author']
57+
inlines = [ChapterTabularInline]
58+
59+
5460
admin.site.register(models.SortableBook, OrderedSortableBookAdmin)
5561
admin.site.register(models.SortableBook1, UpOrderedSortableBookAdmin)
5662
admin.site.register(models.SortableBook2, DownOrderedSortableBookAdmin)
5763
admin.site.register(models.SortableBook3, UnorderedSortableBookAdmin)
5864
admin.site.register(models.SortableBook4, UnorderedSortableBookAdmin)
65+
admin.site.register(models.SortableBook5, UnsortedBookAdmin)

testapp/models.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ class SortableBook(models.Model):
3737
on_delete=models.CASCADE,
3838
)
3939

40+
class Meta:
41+
verbose_name = "Book"
42+
verbose_name_plural = "Books"
43+
4044
def __str__(self):
4145
return self.title
4246

@@ -71,6 +75,13 @@ class Meta:
7175
verbose_name_plural = "Books"
7276

7377

78+
class SortableBook5(SortableBook):
79+
class Meta:
80+
proxy = True
81+
verbose_name = "Book"
82+
verbose_name_plural = "Books"
83+
84+
7485
class Chapter(models.Model):
7586
title = models.CharField(
7687
"Title",

0 commit comments

Comments
 (0)