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:38:52 -0500 |
| commit | 959d0c078a1c903cd1e4850932be77c4f0d2294d (patch) | |
| tree | ede857a032abda167d138638905aa90fef7a3cc7 /django/forms/widgets.py | |
| parent | 1933e56eca1ad17de7dd133bfb7cbee9858a75a3 (diff) | |
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.
Diffstat (limited to 'django/forms/widgets.py')
| -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 |
