From 7794380c5908869bae28eed0b216aa8c1851bac2 Mon Sep 17 00:00:00 2001 From: Gagan Deep Date: Mon, 5 Feb 2024 19:10:01 +0530 Subject: [PATCH] Fixed sortable widget not working in stacked inline admin The draggable/sortable feature were not working for elements dynamically added using "Add another XYZ" link. --- example/testapp/admin.py | 12 +++++++++++- example/testapp/models.py | 5 +++++ sortedm2m/static/sortedm2m/widget.js | 4 +++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/example/testapp/admin.py b/example/testapp/admin.py index ca1cc714..2c85b22a 100644 --- a/example/testapp/admin.py +++ b/example/testapp/admin.py @@ -1,6 +1,6 @@ from django.contrib import admin -from example.testapp.models import Car, ParkingArea +from example.testapp.models import Car, Garage, ParkingArea class ParkingAreaAdmin(admin.ModelAdmin): @@ -15,5 +15,15 @@ class ParkingAreaAdmin(admin.ModelAdmin): ) +class ParkingAreaInlineAdmin(admin.StackedInline): + model = ParkingArea + extra = 0 + + +class GarageAdmin(admin.ModelAdmin): + inlines = [ParkingAreaInlineAdmin] + + admin.site.register(Car) +admin.site.register(Garage, GarageAdmin) admin.site.register(ParkingArea, ParkingAreaAdmin) diff --git a/example/testapp/models.py b/example/testapp/models.py index bc6ce235..73e870b0 100644 --- a/example/testapp/models.py +++ b/example/testapp/models.py @@ -16,8 +16,13 @@ def __str__(self): return str(self.car) + " in " + str(self.parkingarea) # pylint: disable=no-member +class Garage(models.Model): + name = models.CharField(max_length=30) + + class ParkingArea(models.Model): name = models.CharField(max_length=50) + garage = models.ForeignKey(Garage, on_delete=models.CASCADE, null=True, blank=True, default=None) cars = SortedManyToManyField(Car, base_class=BaseCarThrough) def __str__(self): diff --git a/sortedm2m/static/sortedm2m/widget.js b/sortedm2m/static/sortedm2m/widget.js index aacbdf52..4b48dbd6 100644 --- a/sortedm2m/static/sortedm2m/widget.js +++ b/sortedm2m/static/sortedm2m/widget.js @@ -62,7 +62,9 @@ if (typeof jQuery === 'undefined') { } function iterateUl() { - $('.sortedm2m-items').each(function () { + // Add sortable only to visible .sortedm2m-items. + // Exclude element with class .sortedm2m since they are already initialized + $('.sortedm2m-items:visible:not(.sortedm2m)').each(function () { var ul = $(this); prepareUl(ul);