summaryrefslogtreecommitdiff
path: root/django/forms/widgets.py
diff options
context:
space:
mode:
Diffstat (limited to 'django/forms/widgets.py')
-rw-r--r--django/forms/widgets.py30
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