diff options
| author | Matthias Kestenholz <mk@feinheit.ch> | 2019-02-09 15:38:52 +0100 |
|---|---|---|
| committer | Tim Graham <timograham@gmail.com> | 2019-02-09 09:39:15 -0500 |
| commit | e1bd94496bcfe65c244bcd3ca668b900bf488326 (patch) | |
| tree | fe2e8272306c9d32abb1090c1836038516f89ce1 /django | |
| parent | d03e5961aa6555c7427bd054835733fe9c152dc0 (diff) | |
[2.2.x] Fixed #30153 -- Fixed incorrect form Media asset ordering after three way merge.
Delaying merging assets as long as possible avoids introducing
incorrect relative orderings that cause a broken final result.
Backport of 959d0c078a1c903cd1e4850932be77c4f0d2294d from master.
Diffstat (limited to 'django')
| -rw-r--r-- | django/forms/widgets.py | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/django/forms/widgets.py b/django/forms/widgets.py index eed1fa5c3b..02aa32b207 100644 --- a/django/forms/widgets.py +++ b/django/forms/widgets.py @@ -48,8 +48,8 @@ class Media: css = {} if js is None: js = [] - self._css = css - self._js = js + self._css_lists = [css] + self._js_lists = [js] def __repr__(self): return 'Media(css=%r, js=%r)' % (self._css, self._js) @@ -57,6 +57,25 @@ class Media: def __str__(self): return self.render() + @property + def _css(self): + css = self._css_lists[0] + # filter(None, ...) avoids calling merge with empty dicts. + for obj in filter(None, self._css_lists[1:]): + css = { + medium: self.merge(css.get(medium, []), obj.get(medium, [])) + for medium in css.keys() | obj.keys() + } + return css + + @property + def _js(self): + js = self._js_lists[0] + # filter(None, ...) avoids calling merge() with empty lists. + for obj in filter(None, self._js_lists[1:]): + js = self.merge(js, obj) + return js + def render(self): return mark_safe('\n'.join(chain.from_iterable(getattr(self, 'render_' + name)() for name in MEDIA_TYPES))) @@ -132,11 +151,8 @@ class Media: def __add__(self, other): combined = Media() - combined._js = self.merge(self._js, other._js) - combined._css = { - medium: self.merge(self._css.get(medium, []), other._css.get(medium, [])) - for medium in self._css.keys() | other._css.keys() - } + combined._css_lists = self._css_lists + other._css_lists + combined._js_lists = self._js_lists + other._js_lists return combined |
