mirror of
https://github.com/django/django.git
synced 2025-03-06 15:32:33 +00:00
[5.2.x] Fixed #36182 -- Returned "?" if all parameters are removed in querystring template tag.
Thank you to David Feeley for the report and Natalia Bidart for the review. Backport of 05002c153c5018e4429a326a6699c7c45e5ea957 from main.
This commit is contained in:
parent
d3d9f3a5a4
commit
92d5b2f389
@ -1194,18 +1194,18 @@ def querystring(context, query_dict=None, **kwargs):
|
||||
"""
|
||||
if query_dict is None:
|
||||
query_dict = context.request.GET
|
||||
query_dict = query_dict.copy()
|
||||
params = query_dict.copy()
|
||||
for key, value in kwargs.items():
|
||||
if value is None:
|
||||
if key in query_dict:
|
||||
del query_dict[key]
|
||||
if key in params:
|
||||
del params[key]
|
||||
elif isinstance(value, Iterable) and not isinstance(value, str):
|
||||
query_dict.setlist(key, value)
|
||||
params.setlist(key, value)
|
||||
else:
|
||||
query_dict[key] = value
|
||||
if not query_dict:
|
||||
params[key] = value
|
||||
if not params and not query_dict:
|
||||
return ""
|
||||
query_string = query_dict.urlencode()
|
||||
query_string = params.urlencode()
|
||||
return f"?{query_string}"
|
||||
|
||||
|
||||
|
@ -965,7 +965,7 @@ This tag requires a :class:`~django.http.QueryDict` instance, which defaults to
|
||||
:attr:`request.GET <django.http.HttpRequest.GET>` if none is provided.
|
||||
|
||||
If the :class:`~django.http.QueryDict` is empty and no additional parameters
|
||||
are provided, an empty string is returned. A non-empty result includes a
|
||||
are provided, an empty string is returned. Otherwise, the result includes a
|
||||
leading ``"?"``.
|
||||
|
||||
.. admonition:: Using ``request.GET`` as default
|
||||
|
@ -9,4 +9,6 @@ Django 5.1.7 fixes several bugs in 5.1.6.
|
||||
Bugfixes
|
||||
========
|
||||
|
||||
* ...
|
||||
* Fixed a bug in Django 5.1 where the ``{% querystring %}`` template tag
|
||||
returned an empty string rather than ``"?"`` when all parameters had been
|
||||
removed from the query string (:ticket:`36182`).
|
||||
|
@ -20,6 +20,18 @@ class QueryStringTagTests(SimpleTestCase):
|
||||
"test_querystring_empty_get_params", context, expected=""
|
||||
)
|
||||
|
||||
@setup({"test_querystring_remove_all_params": "{% querystring a=None %}"})
|
||||
def test_querystring_remove_all_params(self):
|
||||
non_empty_context = RequestContext(self.request_factory.get("/?a=b"))
|
||||
empty_context = RequestContext(self.request_factory.get("/"))
|
||||
for context, expected in [(non_empty_context, "?"), (empty_context, "")]:
|
||||
with self.subTest(expected=expected):
|
||||
self.assertRenderEqual(
|
||||
"test_querystring_remove_all_params",
|
||||
context,
|
||||
expected,
|
||||
)
|
||||
|
||||
@setup({"test_querystring_non_empty_get_params": "{% querystring %}"})
|
||||
def test_querystring_non_empty_get_params(self):
|
||||
request = self.request_factory.get("/", {"a": "b"})
|
||||
|
Loading…
x
Reference in New Issue
Block a user