[2.1.x] Fixed #29627 -- Fixed QueryDict.urlencode() crash with non-string values.

Regression in 7d96f0c49a.
Backport of d8e2be459f from master
This commit is contained in:
Tim Graham 2018-08-02 21:56:26 -04:00
parent 66c0c58cf2
commit 0cfca0f2cc
3 changed files with 11 additions and 1 deletions

View File

@ -520,7 +520,7 @@ class QueryDict(MultiValueDict):
return urlencode({k: v})
for k, list_ in self.lists():
output.extend(
encode(k.encode(self.encoding), v.encode(self.encoding))
encode(k.encode(self.encoding), str(v).encode(self.encoding))
for v in list_
)
return '&'.join(output)

View File

@ -11,3 +11,6 @@ Bugfixes
* Fixed a race condition in ``QuerySet.update_or_create()`` that could result
in data loss (:ticket:`29499`).
* Fixed a regression where ``QueryDict.urlencode()`` crashed if the dictionary
contains a non-string value (:ticket:`29627`).

View File

@ -114,6 +114,13 @@ class QueryDictTests(SimpleTestCase):
self.assertEqual(q.urlencode(), 'next=%2Ft%C3%ABst%26key%2F')
self.assertEqual(q.urlencode(safe='/'), 'next=/t%C3%ABst%26key/')
def test_urlencode_int(self):
# Normally QueryDict doesn't contain non-string values but lazily
# written tests may make that mistake.
q = QueryDict(mutable=True)
q['a'] = 1
self.assertEqual(q.urlencode(), 'a=1')
def test_mutable_copy(self):
"""A copy of a QueryDict is mutable."""
q = QueryDict().copy()