#27559: Admin changelist turns GET QueryDict into dict which may lose parameters --------------------------------------+------------------------------------ Reporter: Jonas von Poser | Owner: (none) Type: Cleanup/optimization | Status: new Component: contrib.admin | Version: master Severity: Normal | Resolution: Keywords: | Triage Stage: Accepted Has patch: 0 | Needs documentation: 0 Needs tests: 0 | Patch needs improvement: 0 Easy pickings: 0 | UI/UX: 0 --------------------------------------+------------------------------------ Changes (by Ling-Xiao Yang):
* status: assigned => new * owner: Ling-Xiao Yang => (none) Comment: I didn't find a good way of ensuring the backward compatibility, as this turned out as a conceptual problem that has existed for a long time: 1. The admin filters are single-valued by definition ([https://github.com/django/django/blob/f0ef0c49e9284f262fbc63e8a497699ca4a248fe/django/contrib/admin/filters.py#L74-L75 example]) and this is semantically shown as `self.value()` in the code example of [https://docs.djangoproject.com/en/1.10/ref/contrib/admin/#django.contrib.admin.ModelAdmin.list_filter related doc]. 2. The `dict`-typed GET parameters are further [https://github.com/django/django/blob/f0ef0c49e9284f262fbc63e8a497699ca4a248fe/django/contrib/admin/views/main.py#L114 passed from `ChangeList` view to filter classes], which would require a change in both sides. 3. There is a `ChangeList.get_query_string` method that accepts an additional `dict`-typed parameter (`new_params`) to allow modification of GET parameters, see [https://github.com/django/django/blob/f0ef0c49e9284f262fbc63e8a497699ca4a248fe/django/contrib/admin/filters.py#L74-L75 code]. And this method has been used in many places like [https://github.com/django/django/blob/f0ef0c49e9284f262fbc63e8a497699ca4a248fe/django/contrib/admin/filters.py#L106 1], [https://github.com/django/django/blob/f0ef0c49e9284f262fbc63e8a497699ca4a248fe/django/contrib/admin/templatetags/admin_list.py#L44 2], [https://github.com/django/django/blob/f0ef0c49e9284f262fbc63e8a497699ca4a248fe/django/contrib/admin/templatetags/admin_list.py#L175 3] and so on. If we change every `dict` to `QueryDict`, it would be more of a systematic change. 4. I considered an implicit OR connection of SQL queries in my last comment, in order to restrict changes in `ChangeList` only, but this may not be a good idea. First, [https://tools.ietf.org/html/rfc3986#section-3.4 RFC 3986] has no definition on the meaning of multi-valued GET parameter. Also, in the other extension package django-filters, both OR and AND logic are allowed in its `MultipleChoiceFilter`, see [http://django- filter.readthedocs.io/en/develop/ref/filters.html#multiplechoicefilter its doc]. So a multi-valued GET parameter such as `state=1&state=2` does not necessarily mean an OR relationship in the filtering process. I'm deassigning myself here. More people are welcomed to look at this issue. -- Ticket URL: <https://code.djangoproject.com/ticket/27559#comment:4> Django <https://code.djangoproject.com/> The Web framework for perfectionists with deadlines. -- You received this message because you are subscribed to the Google Groups "Django updates" group. To unsubscribe from this group and stop receiving emails from it, send an email to django-updates+unsubscr...@googlegroups.com. To post to this group, send email to django-updates@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/django-updates/063.ea0fee5674e3033d46b5273e9d304d13%40djangoproject.com. For more options, visit https://groups.google.com/d/optout.