diff --git a/django/http/__init__.py b/django/http/__init__.py index ded6d090b1..60b6d15795 100644 --- a/django/http/__init__.py +++ b/django/http/__init__.py @@ -211,8 +211,13 @@ class QueryDict(MultiValueDict): def update(self, other_dict): self._assert_mutable() f = lambda s: str_to_unicode(s, self.encoding) - d = dict([(f(k), f(v)) for k, v in other_dict.items()]) - MultiValueDict.update(self, d) + if hasattr(other_dict, 'lists'): + for key, valuelist in other_dict.lists(): + for value in valuelist: + MultiValueDict.update(self, {f(key): f(value)}) + else: + d = dict([(f(k), f(v)) for k, v in other_dict.items()]) + MultiValueDict.update(self, d) def pop(self, key, *args): self._assert_mutable() diff --git a/tests/regressiontests/httpwrappers/tests.py b/tests/regressiontests/httpwrappers/tests.py index b10c24e7bf..844b356366 100644 --- a/tests/regressiontests/httpwrappers/tests.py +++ b/tests/regressiontests/httpwrappers/tests.py @@ -436,6 +436,14 @@ Traceback (most recent call last): ... UnicodeEncodeError: ..., HTTP response headers must be in US-ASCII format +# +# Regression test for #8278: QueryDict.update(QueryDict) +# +>>> x = QueryDict("a=1&a=2", mutable=True) +>>> y = QueryDict("a=3&a=4") +>>> x.update(y) +>>> x.getlist('a') +[u'1', u'2', u'3', u'4'] """ from django.http import QueryDict, HttpResponse