Opened 3 weeks ago

Last modified 3 weeks ago

#37340 assigned Bug

admin.add_preserved_filters() drops repeated query parameters

Reported by: ollehu Owned by: ollehu
Component: Forms Version: dev
Severity: Normal Keywords:
Cc: ollehu Triage Stage: Accepted
Has patch: no Needs documentation: no
Needs tests: no Patch needs improvement: no
Easy pickings: no UI/UX: no

Description

django.contrib.admin.templatetags.admin_urls.add_preserved_filters() loses repeated query parameters when restoring changelist filters from an admin change form.

Reproduction

Use a changelist URL containing repeated parameters:

/admin/?X__id__exact=57&X__id__exact=54

After opening an object, the change form receives:

_changelist_filters=X__id__exact%3D57%26X__id__exact%3D54

The admin Close/back URL is then generated as:

/admin/?X__exact=54

The first value has been discarded.

Cause

add_preserved_filters() repeatedly converts parse_qsl() results to a regular dictionary.

I have a fix prepared that we already use in a fork and can issue a PR when this gets accepted.

Change History (2)

comment:1 by ollehu, 3 weeks ago

Needs tests: set

comment:2 by Sarah Boyce, 3 weeks ago

Has patch: unset
Needs tests: unset
Triage Stage: Unreviewed → Accepted
Version: 6.1 → dev

Replicated thank you. Please check "has patch" when you have created your PR

  • tests/admin_views/tests.py

    a b class AdminKeepChangeListFiltersTests(TestCase):  
    90959095                    add_preserved_filters(context, url),
    90969096                )
    90979097
     9098    def test_multiple_changelist_filter_values(self):
     9099        changelist_url = reverse("admin:auth_user_changelist")
     9100        context = {
     9101            "opts": User._meta,
     9102            "preserved_filters": urlencode(
     9103                {
     9104                    "_changelist_filters": urlencode(
     9105                        [
     9106                            ("id__exact", 1),
     9107                            ("id__exact", 2),
     9108                        ]
     9109                    )
     9110                }
     9111            ),
     9112        }
     9113        self.assertEqual(
     9114            add_preserved_filters(context, changelist_url),
     9115            f"{changelist_url}?id__exact=1&id__exact=2",
     9116        )
Note: See TracTickets for help on using tickets.
Back to Top