diff options
| author | Jannis Leidel <jannis@leidel.info> | 2011-06-30 09:06:19 +0000 |
|---|---|---|
| committer | Jannis Leidel <jannis@leidel.info> | 2011-06-30 09:06:19 +0000 |
| commit | 38a2444277a84eb6b74425f0e324d1dceb7d2ef1 (patch) | |
| tree | 1bfffc0cc808a57c1250c6e7e2986f8ba721fd9c | |
| parent | 89e0e8b6bc861bb95e55bd5e255e756fe3be1cf2 (diff) | |
Fixed #16050 -- BACKWARDS-INCOMPATIBLE CHANGE: Moved static files of the admin to conventional file system location.
This also removes the need for ADMIN_MEDIA_PREFIX and replaces it with the convention to find admin's static files at STATIC_URL + 'admin/'.
Thanks to Jacob for the review and general help.
git-svn-id: http://code.djangoproject.com/svn/django/trunk@16487 bcc190cf-cafb-0310-a4f2-bffc1f526a37
| -rw-r--r-- | django/conf/__init__.py | 5 | ||||
| -rw-r--r-- | django/conf/global_settings.py | 5 | ||||
| -rw-r--r-- | django/conf/project_template/settings.py | 5 | ||||
| -rw-r--r-- | django/contrib/admin/helpers.py | 5 | ||||
| -rw-r--r-- | django/contrib/admin/options.py | 30 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/css/base.css (renamed from django/contrib/admin/media/css/base.css) | 64 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/css/changelists.css (renamed from django/contrib/admin/media/css/changelists.css) | 10 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/css/dashboard.css (renamed from django/contrib/admin/media/css/dashboard.css) | 0 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/css/forms.css (renamed from django/contrib/admin/media/css/forms.css) | 12 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/css/ie.css (renamed from django/contrib/admin/media/css/ie.css) | 2 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/css/login.css (renamed from django/contrib/admin/media/css/login.css) | 0 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/css/rtl.css (renamed from django/contrib/admin/media/css/rtl.css) | 4 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/css/widgets.css (renamed from django/contrib/admin/media/css/widgets.css) | 40 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/img/arrow-down.gif (renamed from django/contrib/admin/media/img/admin/arrow-down.gif) | bin | 80 -> 80 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/arrow-up.gif (renamed from django/contrib/admin/media/img/admin/arrow-up.gif) | bin | 838 -> 838 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/changelist-bg.gif (renamed from django/contrib/admin/media/img/admin/changelist-bg.gif) | bin | 58 -> 58 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/changelist-bg_rtl.gif (renamed from django/contrib/admin/media/img/admin/changelist-bg_rtl.gif) | bin | 75 -> 75 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/chooser-bg.gif (renamed from django/contrib/admin/media/img/admin/chooser-bg.gif) | bin | 199 -> 199 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/chooser_stacked-bg.gif (renamed from django/contrib/admin/media/img/admin/chooser_stacked-bg.gif) | bin | 212 -> 212 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/default-bg-reverse.gif (renamed from django/contrib/admin/media/img/admin/default-bg-reverse.gif) | bin | 843 -> 843 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/default-bg.gif (renamed from django/contrib/admin/media/img/admin/default-bg.gif) | bin | 844 -> 844 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/deleted-overlay.gif (renamed from django/contrib/admin/media/img/admin/deleted-overlay.gif) | bin | 45 -> 45 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/gis/move_vertex_off.png (renamed from django/contrib/admin/media/img/gis/move_vertex_off.png) | bin | 711 -> 711 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/gis/move_vertex_on.png (renamed from django/contrib/admin/media/img/gis/move_vertex_on.png) | bin | 506 -> 506 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/icon-no.gif (renamed from django/contrib/admin/media/img/admin/icon-no.gif) | bin | 176 -> 176 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/icon-unknown.gif (renamed from django/contrib/admin/media/img/admin/icon-unknown.gif) | bin | 130 -> 130 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/icon-yes.gif (renamed from django/contrib/admin/media/img/admin/icon-yes.gif) | bin | 299 -> 299 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/icon_addlink.gif (renamed from django/contrib/admin/media/img/admin/icon_addlink.gif) | bin | 119 -> 119 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/icon_alert.gif (renamed from django/contrib/admin/media/img/admin/icon_alert.gif) | bin | 145 -> 145 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/icon_calendar.gif (renamed from django/contrib/admin/media/img/admin/icon_calendar.gif) | bin | 192 -> 192 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/icon_changelink.gif (renamed from django/contrib/admin/media/img/admin/icon_changelink.gif) | bin | 119 -> 119 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/icon_clock.gif (renamed from django/contrib/admin/media/img/admin/icon_clock.gif) | bin | 390 -> 390 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/icon_cog.gif (renamed from django/contrib/admin/media/img/admin/icon_cog.gif) | bin | 537 -> 537 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/icon_deletelink.gif (renamed from django/contrib/admin/media/img/admin/icon_deletelink.gif) | bin | 181 -> 181 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/icon_error.gif (renamed from django/contrib/admin/media/img/admin/icon_error.gif) | bin | 319 -> 319 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/icon_searchbox.png (renamed from django/contrib/admin/media/img/admin/icon_searchbox.png) | bin | 667 -> 667 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/icon_success.gif (renamed from django/contrib/admin/media/img/admin/icon_success.gif) | bin | 341 -> 341 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/inline-delete-8bit.png (renamed from django/contrib/admin/media/img/admin/inline-delete-8bit.png) | bin | 477 -> 477 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/inline-delete.png (renamed from django/contrib/admin/media/img/admin/inline-delete.png) | bin | 781 -> 781 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/inline-restore-8bit.png (renamed from django/contrib/admin/media/img/admin/inline-restore-8bit.png) | bin | 447 -> 447 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/inline-restore.png (renamed from django/contrib/admin/media/img/admin/inline-restore.png) | bin | 623 -> 623 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/inline-splitter-bg.gif (renamed from django/contrib/admin/media/img/admin/inline-splitter-bg.gif) | bin | 102 -> 102 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/nav-bg-grabber.gif (renamed from django/contrib/admin/media/img/admin/nav-bg-grabber.gif) | bin | 116 -> 116 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/nav-bg-reverse.gif (renamed from django/contrib/admin/media/img/admin/nav-bg-reverse.gif) | bin | 186 -> 186 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/nav-bg-selected.gif (renamed from django/contrib/admin/media/img/admin/nav-bg-selected.gif) | bin | 265 -> 265 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/nav-bg.gif (renamed from django/contrib/admin/media/img/admin/nav-bg.gif) | bin | 273 -> 273 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/selector-add.gif (renamed from django/contrib/admin/media/img/admin/selector-add.gif) | bin | 606 -> 606 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/selector-addall.gif (renamed from django/contrib/admin/media/img/admin/selector-addall.gif) | bin | 358 -> 358 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/selector-remove.gif (renamed from django/contrib/admin/media/img/admin/selector-remove.gif) | bin | 398 -> 398 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/selector-removeall.gif (renamed from django/contrib/admin/media/img/admin/selector-removeall.gif) | bin | 355 -> 355 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/selector-search.gif (renamed from django/contrib/admin/media/img/admin/selector-search.gif) | bin | 552 -> 552 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/selector_stacked-add.gif (renamed from django/contrib/admin/media/img/admin/selector_stacked-add.gif) | bin | 612 -> 612 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/selector_stacked-remove.gif (renamed from django/contrib/admin/media/img/admin/selector_stacked-remove.gif) | bin | 401 -> 401 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/tool-left.gif (renamed from django/contrib/admin/media/img/admin/tool-left.gif) | bin | 197 -> 197 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/tool-left_over.gif (renamed from django/contrib/admin/media/img/admin/tool-left_over.gif) | bin | 203 -> 203 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/tool-right.gif (renamed from django/contrib/admin/media/img/admin/tool-right.gif) | bin | 198 -> 198 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/tool-right_over.gif (renamed from django/contrib/admin/media/img/admin/tool-right_over.gif) | bin | 200 -> 200 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/tooltag-add.gif (renamed from django/contrib/admin/media/img/admin/tooltag-add.gif) | bin | 932 -> 932 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/tooltag-add_over.gif (renamed from django/contrib/admin/media/img/admin/tooltag-add_over.gif) | bin | 336 -> 336 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/tooltag-arrowright.gif (renamed from django/contrib/admin/media/img/admin/tooltag-arrowright.gif) | bin | 351 -> 351 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/img/tooltag-arrowright_over.gif (renamed from django/contrib/admin/media/img/admin/tooltag-arrowright_over.gif) | bin | 354 -> 354 bytes | |||
| -rw-r--r-- | django/contrib/admin/static/admin/js/LICENSE-JQUERY.txt (renamed from django/contrib/admin/media/js/LICENSE-JQUERY.txt) | 0 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/js/SelectBox.js (renamed from django/contrib/admin/media/js/SelectBox.js) | 0 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/js/SelectFilter2.js (renamed from django/contrib/admin/media/js/SelectFilter2.js) | 4 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/js/actions.js (renamed from django/contrib/admin/media/js/actions.js) | 0 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/js/actions.min.js (renamed from django/contrib/admin/media/js/actions.min.js) | 0 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/js/admin/DateTimeShortcuts.js (renamed from django/contrib/admin/media/js/admin/DateTimeShortcuts.js) | 4 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/js/admin/RelatedObjectLookups.js (renamed from django/contrib/admin/media/js/admin/RelatedObjectLookups.js) | 0 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/js/admin/ordering.js (renamed from django/contrib/admin/media/js/admin/ordering.js) | 0 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/js/calendar.js (renamed from django/contrib/admin/media/js/calendar.js) | 0 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/js/collapse.js (renamed from django/contrib/admin/media/js/collapse.js) | 0 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/js/collapse.min.js (renamed from django/contrib/admin/media/js/collapse.min.js) | 0 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/js/compress.py (renamed from django/contrib/admin/media/js/compress.py) | 0 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/js/core.js (renamed from django/contrib/admin/media/js/core.js) | 0 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/js/getElementsBySelector.js (renamed from django/contrib/admin/media/js/getElementsBySelector.js) | 0 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/js/inlines.js (renamed from django/contrib/admin/media/js/inlines.js) | 0 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/js/inlines.min.js (renamed from django/contrib/admin/media/js/inlines.min.js) | 0 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/js/jquery.init.js (renamed from django/contrib/admin/media/js/jquery.init.js) | 0 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/js/jquery.js (renamed from django/contrib/admin/media/js/jquery.js) | 0 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/js/jquery.min.js (renamed from django/contrib/admin/media/js/jquery.min.js) | 0 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/js/prepopulate.js (renamed from django/contrib/admin/media/js/prepopulate.js) | 0 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/js/prepopulate.min.js (renamed from django/contrib/admin/media/js/prepopulate.min.js) | 0 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/js/timeparse.js (renamed from django/contrib/admin/media/js/timeparse.js) | 0 | ||||
| -rw-r--r-- | django/contrib/admin/static/admin/js/urlify.js (renamed from django/contrib/admin/media/js/urlify.js) | 0 | ||||
| -rw-r--r-- | django/contrib/admin/templates/admin/auth/user/change_password.html | 4 | ||||
| -rw-r--r-- | django/contrib/admin/templates/admin/base.html | 10 | ||||
| -rw-r--r-- | django/contrib/admin/templates/admin/change_form.html | 4 | ||||
| -rw-r--r-- | django/contrib/admin/templates/admin/change_list.html | 6 | ||||
| -rw-r--r-- | django/contrib/admin/templates/admin/change_list_results.html | 5 | ||||
| -rw-r--r-- | django/contrib/admin/templates/admin/edit_inline/stacked.html | 6 | ||||
| -rw-r--r-- | django/contrib/admin/templates/admin/edit_inline/tabular.html | 6 | ||||
| -rw-r--r-- | django/contrib/admin/templates/admin/index.html | 4 | ||||
| -rw-r--r-- | django/contrib/admin/templates/admin/login.html | 4 | ||||
| -rw-r--r-- | django/contrib/admin/templates/admin/search_form.html | 5 | ||||
| -rw-r--r-- | django/contrib/admin/templates/registration/password_change_form.html | 4 | ||||
| -rw-r--r-- | django/contrib/admin/templatetags/admin_list.py | 7 | ||||
| -rw-r--r-- | django/contrib/admin/templatetags/adminmedia.py | 4 | ||||
| -rw-r--r-- | django/contrib/admin/widgets.py | 34 | ||||
| -rw-r--r-- | django/contrib/gis/admin/widgets.py | 11 | ||||
| -rw-r--r-- | django/contrib/gis/templates/gis/admin/openlayers.html | 5 | ||||
| -rw-r--r-- | django/contrib/staticfiles/storage.py | 9 | ||||
| -rw-r--r-- | django/core/servers/basehttp.py | 13 | ||||
| -rw-r--r-- | django/templatetags/static.py | 20 | ||||
| -rw-r--r-- | docs/howto/static-files.txt | 28 | ||||
| -rw-r--r-- | docs/internals/deprecation.txt | 5 | ||||
| -rw-r--r-- | docs/ref/contrib/staticfiles.txt | 45 | ||||
| -rw-r--r-- | docs/ref/settings.txt | 14 | ||||
| -rw-r--r-- | docs/ref/templates/api.txt | 2 | ||||
| -rw-r--r-- | docs/ref/templates/builtins.txt | 239 | ||||
| -rw-r--r-- | docs/releases/1.4.txt | 36 | ||||
| -rw-r--r-- | tests/regressiontests/admin_util/tests.py | 2 | ||||
| -rw-r--r-- | tests/regressiontests/admin_widgets/tests.py | 19 | ||||
| -rw-r--r-- | tests/regressiontests/forms/tests/media.py | 39 | ||||
| -rw-r--r-- | tests/regressiontests/servers/tests.py | 27 | ||||
| -rw-r--r-- | tests/regressiontests/staticfiles_tests/project/site_media/static/test/storage.txt | 1 | ||||
| -rw-r--r-- | tests/regressiontests/staticfiles_tests/tests.py | 90 | ||||
| -rw-r--r-- | tests/regressiontests/templates/tests.py | 3 | ||||
| -rwxr-xr-x | tests/runtests.py | 2 |
118 files changed, 485 insertions, 418 deletions
diff --git a/django/conf/__init__.py b/django/conf/__init__.py index c99b307c6d..4337bd4c11 100644 --- a/django/conf/__init__.py +++ b/django/conf/__init__.py @@ -68,8 +68,11 @@ class BaseSettings(object): """ def __setattr__(self, name, value): if name in ("MEDIA_URL", "STATIC_URL") and value and not value.endswith('/'): - warnings.warn('If set, %s must end with a slash' % name, + warnings.warn("If set, %s must end with a slash" % name, DeprecationWarning) + elif name == "ADMIN_MEDIA_PREFIX": + warnings.warn("The ADMIN_MEDIA_PREFIX setting has been removed; " + "use STATIC_URL instead.", DeprecationWarning) object.__setattr__(self, name, value) diff --git a/django/conf/global_settings.py b/django/conf/global_settings.py index fedea55bac..5ee12d715f 100644 --- a/django/conf/global_settings.py +++ b/django/conf/global_settings.py @@ -593,8 +593,3 @@ STATICFILES_FINDERS = ( 'django.contrib.staticfiles.finders.AppDirectoriesFinder', # 'django.contrib.staticfiles.finders.DefaultStorageFinder', ) - -# URL prefix for admin media -- CSS, JavaScript and images. -# Make sure to use a trailing slash. -# Examples: "http://foo.com/static/admin/", "/static/admin/". -ADMIN_MEDIA_PREFIX = '/static/admin/' diff --git a/django/conf/project_template/settings.py b/django/conf/project_template/settings.py index 794522b202..3a2243fbc6 100644 --- a/django/conf/project_template/settings.py +++ b/django/conf/project_template/settings.py @@ -62,11 +62,6 @@ STATIC_ROOT = '' # Example: "http://media.lawrence.com/static/" STATIC_URL = '/static/' -# URL prefix for admin static files -- CSS, JavaScript and images. -# Make sure to use a trailing slash. -# Examples: "http://foo.com/static/admin/", "/static/admin/". -ADMIN_MEDIA_PREFIX = '/static/admin/' - # Additional locations of static files STATICFILES_DIRS = ( # Put strings here, like "/home/html/static" or "C:/www/django/static". diff --git a/django/contrib/admin/helpers.py b/django/contrib/admin/helpers.py index 0c2f287fe5..d15716b909 100644 --- a/django/contrib/admin/helpers.py +++ b/django/contrib/admin/helpers.py @@ -1,5 +1,4 @@ from django import forms -from django.conf import settings from django.contrib.admin.util import (flatten_fieldsets, lookup_field, display_for_field, label_for_field, help_text_for_field) from django.contrib.contenttypes.models import ContentType @@ -75,8 +74,8 @@ class Fieldset(object): def _media(self): if 'collapse' in self.classes: - js = ['js/jquery.min.js', 'js/jquery.init.js', 'js/collapse.min.js'] - return forms.Media(js=['%s%s' % (settings.ADMIN_MEDIA_PREFIX, url) for url in js]) + js = ['jquery.min.js', 'jquery.init.js', 'collapse.min.js'] + return forms.Media(js=['admin/js/%s' % url for url in js]) return forms.Media() media = property(_media) diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py index 6d33239292..703421f1bc 100644 --- a/django/contrib/admin/options.py +++ b/django/contrib/admin/options.py @@ -349,19 +349,19 @@ class ModelAdmin(BaseModelAdmin): urls = property(urls) def _media(self): - from django.conf import settings - - js = ['js/core.js', 'js/admin/RelatedObjectLookups.js', - 'js/jquery.min.js', 'js/jquery.init.js'] + js = [ + 'core.js', + 'admin/RelatedObjectLookups.js', + 'jquery.min.js', + 'jquery.init.js' + ] if self.actions is not None: - js.extend(['js/actions.min.js']) + js.append('actions.min.js') if self.prepopulated_fields: - js.append('js/urlify.js') - js.append('js/prepopulate.min.js') + js.extend(['urlify.js', 'prepopulate.min.js']) if self.opts.get_ordered_objects(): - js.extend(['js/getElementsBySelector.js', 'js/dom-drag.js' , 'js/admin/ordering.js']) - - return forms.Media(js=['%s%s' % (settings.ADMIN_MEDIA_PREFIX, url) for url in js]) + js.extend(['getElementsBySelector.js', 'dom-drag.js' , 'admin/ordering.js']) + return forms.Media(js=['admin/js/%s' % url for url in js]) media = property(_media) def has_add_permission(self, request): @@ -1321,14 +1321,12 @@ class InlineModelAdmin(BaseModelAdmin): self.verbose_name_plural = self.model._meta.verbose_name_plural def _media(self): - from django.conf import settings - js = ['js/jquery.min.js', 'js/jquery.init.js', 'js/inlines.min.js'] + js = ['jquery.min.js', 'jquery.init.js', 'inlines.min.js'] if self.prepopulated_fields: - js.append('js/urlify.js') - js.append('js/prepopulate.min.js') + js.extend(['urlify.js, prepopulate.min.js']) if self.filter_vertical or self.filter_horizontal: - js.extend(['js/SelectBox.js' , 'js/SelectFilter2.js']) - return forms.Media(js=['%s%s' % (settings.ADMIN_MEDIA_PREFIX, url) for url in js]) + js.extend(['SelectBox.js', 'SelectFilter2.js']) + return forms.Media(js=['admin/js/%s' % url for url in js]) media = property(_media) def get_formset(self, request, obj=None, **kwargs): diff --git a/django/contrib/admin/media/css/base.css b/django/contrib/admin/static/admin/css/base.css index 6d1b673b90..23fddafd7a 100644 --- a/django/contrib/admin/media/css/base.css +++ b/django/contrib/admin/static/admin/css/base.css @@ -259,7 +259,7 @@ tfoot td { color: #666; padding: 2px 5px; font-size: 11px; - background: #e1e1e1 url(../img/admin/nav-bg.gif) top left repeat-x; + background: #e1e1e1 url(../img/nav-bg.gif) top left repeat-x; border-left: 1px solid #ddd; border-bottom: 1px solid #ddd; } @@ -311,7 +311,7 @@ thead th a:link, thead th a:visited { } thead th.sorted { - background: #c5c5c5 url(../img/admin/nav-bg-selected.gif) top left repeat-x; + background: #c5c5c5 url(../img/nav-bg-selected.gif) top left repeat-x; } table thead th.sorted a { @@ -319,11 +319,11 @@ table thead th.sorted a { } table thead th.ascending a { - background: url(../img/admin/arrow-up.gif) right .4em no-repeat; + background: url(../img/arrow-up.gif) right .4em no-repeat; } table thead th.descending a { - background: url(../img/admin/arrow-down.gif) right .4em no-repeat; + background: url(../img/arrow-down.gif) right .4em no-repeat; } table thead th.sorted a span.text { @@ -368,7 +368,7 @@ table thead th.sorted a span.clear { #sorting-popup-div .cancel { font-size: 10px; - background: #e1e1e1 url(../img/admin/nav-bg.gif) 0 50% repeat-x; + background: #e1e1e1 url(../img/nav-bg.gif) 0 50% repeat-x; border-top: 1px solid #ddd; text-align: center; } @@ -386,7 +386,7 @@ table.orderable tbody tr td:hover { table.orderable tbody tr td:first-child { padding-left: 14px; - background-image: url(../img/admin/nav-bg-grabber.gif); + background-image: url(../img/nav-bg-grabber.gif); background-repeat: repeat-y; } @@ -416,7 +416,7 @@ input[type=text], input[type=password], textarea, select, .vTextField { /* FORM BUTTONS */ .button, input[type=submit], input[type=button], .submit-row input { - background: white url(../img/admin/nav-bg.gif) bottom repeat-x; + background: white url(../img/nav-bg.gif) bottom repeat-x; padding: 3px 5px; color: black; border: 1px solid #bbb; @@ -424,31 +424,31 @@ input[type=text], input[type=password], textarea, select, .vTextField { } .button:active, input[type=submit]:active, input[type=button]:active { - background-image: url(../img/admin/nav-bg-reverse.gif); + background-image: url(../img/nav-bg-reverse.gif); background-position: top; } .button[disabled], input[type=submit][disabled], input[type=button][disabled] { - background-image: url(../img/admin/nav-bg.gif); + background-image: url(../img/nav-bg.gif); background-position: bottom; opacity: 0.4; } .button.default, input[type=submit].default, .submit-row input.default { border: 2px solid #5b80b2; - background: #7CA0C7 url(../img/admin/default-bg.gif) bottom repeat-x; + background: #7CA0C7 url(../img/default-bg.gif) bottom repeat-x; font-weight: bold; color: white; float: right; } .button.default:active, input[type=submit].default:active { - background-image: url(../img/admin/default-bg-reverse.gif); + background-image: url(../img/default-bg-reverse.gif); background-position: top; } .button[disabled].default, input[type=submit][disabled].default, input[type=button][disabled].default { - background-image: url(../img/admin/default-bg.gif); + background-image: url(../img/default-bg.gif); background-position: bottom; opacity: 0.4; } @@ -485,7 +485,7 @@ input[type=text], input[type=password], textarea, select, .vTextField { font-size: 11px; text-align: left; font-weight: bold; - background: #7CA0C7 url(../img/admin/default-bg.gif) top left repeat-x; + background: #7CA0C7 url(../img/default-bg.gif) top left repeat-x; color: white; } @@ -507,15 +507,15 @@ ul.messagelist li { margin: 0 0 3px 0; border-bottom: 1px solid #ddd; color: #666; - background: #ffc url(../img/admin/icon_success.gif) 5px .3em no-repeat; + background: #ffc url(../img/icon_success.gif) 5px .3em no-repeat; } ul.messagelist li.warning{ - background-image: url(../img/admin/icon_alert.gif); + background-image: url(../img/icon_alert.gif); } ul.messagelist li.error{ - background-image: url(../img/admin/icon_error.gif); + background-image: url(../img/icon_error.gif); } .errornote { @@ -525,7 +525,7 @@ ul.messagelist li.error{ margin: 0 0 3px 0; border: 1px solid red; color: red; - background: #ffc url(../img/admin/icon_error.gif) 5px .3em no-repeat; + background: #ffc url(../img/icon_error.gif) 5px .3em no-repeat; } ul.errorlist { @@ -540,7 +540,7 @@ ul.errorlist { margin: 0 0 3px 0; border: 1px solid red; color: white; - background: red url(../img/admin/icon_alert.gif) 5px .3em no-repeat; + background: red url(../img/icon_alert.gif) 5px .3em no-repeat; } .errorlist li a { @@ -576,7 +576,7 @@ div.system-message p.system-message-title { padding: 4px 5px 4px 25px; margin: 0; color: red; - background: #ffc url(../img/admin/icon_error.gif) 5px .3em no-repeat; + background: #ffc url(../img/icon_error.gif) 5px .3em no-repeat; } .description { @@ -587,7 +587,7 @@ div.system-message p.system-message-title { /* BREADCRUMBS */ div.breadcrumbs { - background: white url(../img/admin/nav-bg-reverse.gif) 0 -10px repeat-x; + background: white url(../img/nav-bg-reverse.gif) 0 -10px repeat-x; padding: 2px 8px 3px 8px; font-size: 11px; color: #999; @@ -600,17 +600,17 @@ div.breadcrumbs { .addlink { padding-left: 12px; - background: url(../img/admin/icon_addlink.gif) 0 .2em no-repeat; + background: url(../img/icon_addlink.gif) 0 .2em no-repeat; } .changelink { padding-left: 12px; - background: url(../img/admin/icon_changelink.gif) 0 .2em no-repeat; + background: url(../img/icon_changelink.gif) 0 .2em no-repeat; } .deletelink { padding-left: 12px; - background: url(../img/admin/icon_deletelink.gif) 0 .25em no-repeat; + background: url(../img/icon_deletelink.gif) 0 .25em no-repeat; } a.deletelink:link, a.deletelink:visited { @@ -645,14 +645,14 @@ a.deletelink:hover { .object-tools li { display: block; float: left; - background: url(../img/admin/tool-left.gif) 0 0 no-repeat; + background: url(../img/tool-left.gif) 0 0 no-repeat; padding: 0 0 0 8px; margin-left: 2px; height: 16px; } .object-tools li:hover { - background: url(../img/admin/tool-left_over.gif) 0 0 no-repeat; + background: url(../img/tool-left_over.gif) 0 0 no-repeat; } .object-tools a:link, .object-tools a:visited { @@ -661,29 +661,29 @@ a.deletelink:hover { color: white; padding: .1em 14px .1em 8px; height: 14px; - background: #999 url(../img/admin/tool-right.gif) 100% 0 no-repeat; + background: #999 url(../img/tool-right.gif) 100% 0 no-repeat; } .object-tools a:hover, .object-tools li:hover a { - background: #5b80b2 url(../img/admin/tool-right_over.gif) 100% 0 no-repeat; + background: #5b80b2 url(../img/tool-right_over.gif) 100% 0 no-repeat; } .object-tools a.viewsitelink, .object-tools a.golink { - background: #999 url(../img/admin/tooltag-arrowright.gif) top right no-repeat; + background: #999 url(../img/tooltag-arrowright.gif) top right no-repeat; padding-right: 28px; } .object-tools a.viewsitelink:hover, .object-tools a.golink:hover { - background: #5b80b2 url(../img/admin/tooltag-arrowright_over.gif) top right no-repeat; + background: #5b80b2 url(../img/tooltag-arrowright_over.gif) top right no-repeat; } .object-tools a.addlink { - background: #999 url(../img/admin/tooltag-add.gif) top right no-repeat; + background: #999 url(../img/tooltag-add.gif) top right no-repeat; padding-right: 28px; } .object-tools a.addlink:hover { - background: #5b80b2 url(../img/admin/tooltag-add_over.gif) top right no-repeat; + background: #5b80b2 url(../img/tooltag-add_over.gif) top right no-repeat; } /* OBJECT HISTORY */ @@ -818,7 +818,7 @@ table#change-history tbody th { } #content-related .module h2 { - background: #eee url(../img/admin/nav-bg.gif) bottom left repeat-x; + background: #eee url(../img/nav-bg.gif) bottom left repeat-x; color: #666; } diff --git a/django/contrib/admin/media/css/changelists.css b/django/contrib/admin/static/admin/css/changelists.css index 315b8c7a38..8eeca3d60d 100644 --- a/django/contrib/admin/media/css/changelists.css +++ b/django/contrib/admin/static/admin/css/changelists.css @@ -20,7 +20,7 @@ } .change-list .filtered { - background: white url(../img/admin/changelist-bg.gif) top right repeat-y !important; + background: white url(../img/changelist-bg.gif) top right repeat-y !important; } .change-list .filtered .results, .change-list .filtered .paginator, .filtered #toolbar, .filtered div.xfull { @@ -40,7 +40,7 @@ color: #666; border-top: 1px solid #eee; border-bottom: 1px solid #eee; - background: white url(../img/admin/nav-bg.gif) 0 180% repeat-x; + background: white url(../img/nav-bg.gif) 0 180% repeat-x; overflow: hidden; } @@ -82,7 +82,7 @@ #changelist #toolbar { padding: 3px; border-bottom: 1px solid #ddd; - background: #e1e1e1 url(../img/admin/nav-bg.gif) top left repeat-x; + background: #e1e1e1 url(../img/nav-bg.gif) top left repeat-x; color: #666; } @@ -156,7 +156,7 @@ .change-list ul.toplinks { display: block; - background: white url(../img/admin/nav-bg-reverse.gif) 0 -10px repeat-x; + background: white url(../img/nav-bg-reverse.gif) 0 -10px repeat-x; border-top: 1px solid white; float: left; padding: 0 !important; @@ -246,7 +246,7 @@ padding: 3px; border-top: 1px solid #fff; border-bottom: 1px solid #ddd; - background: white url(../img/admin/nav-bg-reverse.gif) 0 -10px repeat-x; + background: white url(../img/nav-bg-reverse.gif) 0 -10px repeat-x; } #changelist .actions.selected { diff --git a/django/contrib/admin/media/css/dashboard.css b/django/contrib/admin/static/admin/css/dashboard.css index ceefe1525f..ceefe1525f 100644 --- a/django/contrib/admin/media/css/dashboard.css +++ b/django/contrib/admin/static/admin/css/dashboard.css diff --git a/django/contrib/admin/media/css/forms.css b/django/contrib/admin/static/admin/css/forms.css index 5149732719..0ecfca784c 100644 --- a/django/contrib/admin/media/css/forms.css +++ b/django/contrib/admin/static/admin/css/forms.css @@ -140,7 +140,7 @@ fieldset.collapsed h2, fieldset.collapsed { } fieldset.collapsed h2 { - background-image: url(../img/admin/nav-bg.gif); + background-image: url(../img/nav-bg.gif); background-position: bottom left; color: #999; } @@ -161,7 +161,7 @@ fieldset.monospace textarea { .submit-row { padding: 5px 7px; text-align: right; - background: white url(../img/admin/nav-bg.gif) 0 100% repeat-x; + background: white url(../img/nav-bg.gif) 0 100% repeat-x; border: 1px solid #ccc; margin: 5px 0; overflow: hidden; @@ -184,7 +184,7 @@ body.popup .submit-row { } .submit-row .deletelink { - background: url(../img/admin/icon_deletelink.gif) 0 50% no-repeat; + background: url(../img/icon_deletelink.gif) 0 50% no-repeat; padding-left: 14px; } @@ -251,7 +251,7 @@ body.popup .submit-row { color: #666; padding: 3px 5px; font-size: 11px; - background: #e1e1e1 url(../img/admin/nav-bg.gif) top left repeat-x; + background: #e1e1e1 url(../img/nav-bg.gif) top left repeat-x; border-bottom: 1px solid #ddd; } @@ -336,7 +336,7 @@ body.popup .submit-row { color: #666; padding: 3px 5px; border-bottom: 1px solid #ddd; - background: #e1e1e1 url(../img/admin/nav-bg.gif) top left repeat-x; + background: #e1e1e1 url(../img/nav-bg.gif) top left repeat-x; } .inline-group .tabular tr.add-row td { @@ -347,7 +347,7 @@ body.popup .submit-row { .inline-group ul.tools a.add, .inline-group div.add-row a, .inline-group .tabular tr.add-row td a { - background: url(../img/admin/icon_addlink.gif) 0 50% no-repeat; + background: url(../img/icon_addlink.gif) 0 50% no-repeat; padding-left: 14px; font-size: 11px; outline: 0; /* Remove dotted border around link */ diff --git a/django/contrib/admin/media/css/ie.css b/django/contrib/admin/static/admin/css/ie.css index 5fd1ce364b..3776e991ff 100644 --- a/django/contrib/admin/media/css/ie.css +++ b/django/contrib/admin/static/admin/css/ie.css @@ -53,5 +53,5 @@ /* IE doesn't know alpha transparency in PNGs */ .inline-deletelink { - background: transparent url(../img/admin/inline-delete-8bit.png) no-repeat; + background: transparent url(../img/inline-delete-8bit.png) no-repeat; }
\ No newline at end of file diff --git a/django/contrib/admin/media/css/login.css b/django/contrib/admin/static/admin/css/login.css index 8d90d12901..8d90d12901 100644 --- a/django/contrib/admin/media/css/login.css +++ b/django/contrib/admin/static/admin/css/login.css diff --git a/django/contrib/admin/media/css/rtl.css b/django/contrib/admin/static/admin/css/rtl.css index ec2bb2a9da..c32fcf0808 100644 --- a/django/contrib/admin/media/css/rtl.css +++ b/django/contrib/admin/static/admin/css/rtl.css @@ -113,7 +113,7 @@ table thead th.sorted a span.sortpos { } .change-list .filtered { - background: white url(../img/admin/changelist-bg_rtl.gif) top left repeat-y !important; + background: white url(../img/changelist-bg_rtl.gif) top left repeat-y !important; } .change-list .filtered table { @@ -170,7 +170,7 @@ table thead th.sorted a span.sortpos { } .submit-row .deletelink { - background: url(../img/admin/icon_deletelink.gif) 0 50% no-repeat; + background: url(../img/icon_deletelink.gif) 0 50% no-repeat; padding-right: 14px; } diff --git a/django/contrib/admin/media/css/widgets.css b/django/contrib/admin/static/admin/css/widgets.css index 26400fac50..4f4ea0a8f5 100644 --- a/django/contrib/admin/media/css/widgets.css +++ b/django/contrib/admin/static/admin/css/widgets.css @@ -22,7 +22,7 @@ } .selector .selector-available h2 { - background: white url(../img/admin/nav-bg.gif) bottom left repeat-x; + background: white url(../img/nav-bg.gif) bottom left repeat-x; color: #666; } @@ -49,7 +49,7 @@ float: left; width: 22px; height: 50px; - background: url(../img/admin/chooser-bg.gif) top center no-repeat; + background: url(../img/chooser-bg.gif) top center no-repeat; margin: 8em 3px 0 3px; padding: 0; } @@ -74,12 +74,12 @@ } .selector-add { - background: url(../img/admin/selector-add.gif) top center no-repeat; + background: url(../img/selector-add.gif) top center no-repeat; margin-bottom: 2px; } .selector-remove { - background: url(../img/admin/selector-remove.gif) top center no-repeat; + background: url(../img/selector-remove.gif) top center no-repeat; } a.selector-chooseall, a.selector-clearall { @@ -99,11 +99,11 @@ a.selector-chooseall:hover, a.selector-clearall:hover { a.selector-chooseall { width: 7em; - background: url(../img/admin/selector-addall.gif) left center no-repeat; + background: url(../img/selector-addall.gif) left center no-repeat; } a.selector-clearall { - background: url(../img/admin/selector-removeall.gif) left center no-repeat; + background: url(../img/selector-removeall.gif) left center no-repeat; } @@ -135,7 +135,7 @@ a.selector-clearall { height: 22px; width: 50px; margin: 0 0 3px 40%; - background: url(../img/admin/chooser_stacked-bg.gif) top center no-repeat; + background: url(../img/chooser_stacked-bg.gif) top center no-repeat; } .stacked .selector-chooser li { @@ -148,11 +148,11 @@ a.selector-clearall { } .stacked .selector-add { - background-image: url(../img/admin/selector_stacked-add.gif); + background-image: url(../img/selector_stacked-add.gif); } .stacked .selector-remove { - background-image: url(../img/admin/selector_stacked-remove.gif); + background-image: url(../img/selector_stacked-remove.gif); } @@ -246,7 +246,7 @@ span.clearable-file-input label { color: #666; padding: 2px 3px; text-align: center; - background: #e1e1e1 url(../img/admin/nav-bg.gif) 0 50% repeat-x; + background: #e1e1e1 url(../img/nav-bg.gif) 0 50% repeat-x; border-bottom: 1px solid #ddd; } @@ -314,7 +314,7 @@ span.clearable-file-input label { position: absolute; font-weight: bold; font-size: 12px; - background: #C9DBED url(../img/admin/default-bg.gif) bottom left repeat-x; + background: #C9DBED url(../img/default-bg.gif) bottom left repeat-x; padding: 1px 4px 2px 4px; color: white; } @@ -337,7 +337,7 @@ span.clearable-file-input label { margin: 0 !important; padding: 0; font-size: 10px; - background: #e1e1e1 url(../img/admin/nav-bg.gif) 0 50% repeat-x; + background: #e1e1e1 url(../img/nav-bg.gif) 0 50% repeat-x; border-top: 1px solid #ddd; } @@ -374,7 +374,7 @@ ul.orderer li { border-width: 0 1px 1px 0; white-space: nowrap; overflow: hidden; - background: #e2e2e2 url(../img/admin/nav-bg-grabber.gif) repeat-y; + background: #e2e2e2 url(../img/nav-bg-grabber.gif) repeat-y; } ul.orderer li:hover { @@ -406,7 +406,7 @@ ul.orderer li.selected { } ul.orderer li.deleted { - background: #bbb url(../img/admin/deleted-overlay.gif); + background: #bbb url(../img/deleted-overlay.gif); } ul.orderer li.deleted a:link, ul.orderer li.deleted a:visited { @@ -414,7 +414,7 @@ ul.orderer li.deleted a:link, ul.orderer li.deleted a:visited { } ul.orderer li.deleted .inline-deletelink { - background-image: url(../img/admin/inline-restore.png); + background-image: url(../img/inline-restore.png); } ul.orderer li.deleted:hover, ul.orderer li.deleted a.selector:hover { @@ -426,7 +426,7 @@ ul.orderer li.deleted:hover, ul.orderer li.deleted a.selector:hover { .inline-deletelink { float: right; text-indent: -9999px; - background: transparent url(../img/admin/inline-delete.png) no-repeat; + background: transparent url(../img/inline-delete.png) no-repeat; width: 15px; height: 15px; border: 0px none; @@ -465,11 +465,11 @@ ul.orderer li.deleted:hover, ul.orderer li.deleted a.selector:hover { } .editinline tr.deleted { - background: #ddd url(../img/admin/deleted-overlay.gif); + background: #ddd url(../img/deleted-overlay.gif); } .editinline tr.deleted .inline-deletelink { - background-image: url(../img/admin/inline-restore.png); + background-image: url(../img/inline-restore.png); } .editinline tr.deleted td:hover { @@ -500,13 +500,13 @@ ul.orderer li.deleted:hover, ul.orderer li.deleted a.selector:hover { .editinline-stacked .inline-splitter { float: left; width: 9px; - background: #f8f8f8 url(../img/admin/inline-splitter-bg.gif) 50% 50% no-repeat; + background: #f8f8f8 url(../img/inline-splitter-bg.gif) 50% 50% no-repeat; border-right: 1px solid #ccc; } .editinline-stacked .controls { clear: both; - background: #e1e1e1 url(../img/admin/nav-bg.gif) top left repeat-x; + background: #e1e1e1 url(../img/nav-bg.gif) top left repeat-x; padding: 3px 4px; font-size: 11px; border-top: 1px solid #ddd; diff --git a/django/contrib/admin/media/img/admin/arrow-down.gif b/django/contrib/admin/static/admin/img/arrow-down.gif Binary files differindex a967b9fd55..a967b9fd55 100644 --- a/django/contrib/admin/media/img/admin/arrow-down.gif +++ b/django/contrib/admin/static/admin/img/arrow-down.gif diff --git a/django/contrib/admin/media/img/admin/arrow-up.gif b/django/contrib/admin/static/admin/img/arrow-up.gif Binary files differindex 3fe4851399..3fe4851399 100644 --- a/django/contrib/admin/media/img/admin/arrow-up.gif +++ b/django/contrib/admin/static/admin/img/arrow-up.gif diff --git a/django/contrib/admin/media/img/admin/changelist-bg.gif b/django/contrib/admin/static/admin/img/changelist-bg.gif Binary files differindex 7f4699470a..7f4699470a 100644 --- a/django/contrib/admin/media/img/admin/changelist-bg.gif +++ b/django/contrib/admin/static/admin/img/changelist-bg.gif diff --git a/django/contrib/admin/media/img/admin/changelist-bg_rtl.gif b/django/contrib/admin/static/admin/img/changelist-bg_rtl.gif Binary files differindex 237971257f..237971257f 100644 --- a/django/contrib/admin/media/img/admin/changelist-bg_rtl.gif +++ b/django/contrib/admin/static/admin/img/changelist-bg_rtl.gif diff --git a/django/contrib/admin/media/img/admin/chooser-bg.gif b/django/contrib/admin/static/admin/img/chooser-bg.gif Binary files differindex 30e83c2518..30e83c2518 100644 --- a/django/contrib/admin/media/img/admin/chooser-bg.gif +++ b/django/contrib/admin/static/admin/img/chooser-bg.gif diff --git a/django/contrib/admin/media/img/admin/chooser_stacked-bg.gif b/django/contrib/admin/static/admin/img/chooser_stacked-bg.gif Binary files differindex 5d104b6d98..5d104b6d98 100644 --- a/django/contrib/admin/media/img/admin/chooser_stacked-bg.gif +++ b/django/contrib/admin/static/admin/img/chooser_stacked-bg.gif diff --git a/django/contrib/admin/media/img/admin/default-bg-reverse.gif b/django/contrib/admin/static/admin/img/default-bg-reverse.gif Binary files differindex 0873281e51..0873281e51 100644 --- a/django/contrib/admin/media/img/admin/default-bg-reverse.gif +++ b/django/contrib/admin/static/admin/img/default-bg-reverse.gif diff --git a/django/contrib/admin/media/img/admin/default-bg.gif b/django/contrib/admin/static/admin/img/default-bg.gif Binary files differindex 003aeca59f..003aeca59f 100644 --- a/django/contrib/admin/media/img/admin/default-bg.gif +++ b/django/contrib/admin/static/admin/img/default-bg.gif diff --git a/django/contrib/admin/media/img/admin/deleted-overlay.gif b/django/contrib/admin/static/admin/img/deleted-overlay.gif Binary files differindex dc3828fe06..dc3828fe06 100644 --- a/django/contrib/admin/media/img/admin/deleted-overlay.gif +++ b/django/contrib/admin/static/admin/img/deleted-overlay.gif diff --git a/django/contrib/admin/media/img/gis/move_vertex_off.png b/django/contrib/admin/static/admin/img/gis/move_vertex_off.png Binary files differindex 296b2e29c9..296b2e29c9 100644 --- a/django/contrib/admin/media/img/gis/move_vertex_off.png +++ b/django/contrib/admin/static/admin/img/gis/move_vertex_off.png diff --git a/django/contrib/admin/media/img/gis/move_vertex_on.png b/django/contrib/admin/static/admin/img/gis/move_vertex_on.png Binary files differindex 21f4758d9c..21f4758d9c 100644 --- a/django/contrib/admin/media/img/gis/move_vertex_on.png +++ b/django/contrib/admin/static/admin/img/gis/move_vertex_on.png diff --git a/django/contrib/admin/media/img/admin/icon-no.gif b/django/contrib/admin/static/admin/img/icon-no.gif Binary files differindex 1b4ee58145..1b4ee58145 100644 --- a/django/contrib/admin/media/img/admin/icon-no.gif +++ b/django/contrib/admin/static/admin/img/icon-no.gif diff --git a/django/contrib/admin/media/img/admin/icon-unknown.gif b/django/contrib/admin/static/admin/img/icon-unknown.gif Binary files differindex cfd2b02ad9..cfd2b02ad9 100644 --- a/django/contrib/admin/media/img/admin/icon-unknown.gif +++ b/django/contrib/admin/static/admin/img/icon-unknown.gif diff --git a/django/contrib/admin/media/img/admin/icon-yes.gif b/django/contrib/admin/static/admin/img/icon-yes.gif Binary files differindex 7399282740..7399282740 100644 --- a/django/contrib/admin/media/img/admin/icon-yes.gif +++ b/django/contrib/admin/static/admin/img/icon-yes.gif diff --git a/django/contrib/admin/media/img/admin/icon_addlink.gif b/django/contrib/admin/static/admin/img/icon_addlink.gif Binary files differindex ee70e1adba..ee70e1adba 100644 --- a/django/contrib/admin/media/img/admin/icon_addlink.gif +++ b/django/contrib/admin/static/admin/img/icon_addlink.gif diff --git a/django/contrib/admin/media/img/admin/icon_alert.gif b/django/contrib/admin/static/admin/img/icon_alert.gif Binary files differindex a1dde26254..a1dde26254 100644 --- a/django/contrib/admin/media/img/admin/icon_alert.gif +++ b/django/contrib/admin/static/admin/img/icon_alert.gif diff --git a/django/contrib/admin/media/img/admin/icon_calendar.gif b/django/contrib/admin/static/admin/img/icon_calendar.gif Binary files differindex 7587b305a4..7587b305a4 100644 --- a/django/contrib/admin/media/img/admin/icon_calendar.gif +++ b/django/contrib/admin/static/admin/img/icon_calendar.gif diff --git a/django/contrib/admin/media/img/admin/icon_changelink.gif b/django/contrib/admin/static/admin/img/icon_changelink.gif Binary files differindex e1b9afde65..e1b9afde65 100644 --- a/django/contrib/admin/media/img/admin/icon_changelink.gif +++ b/django/contrib/admin/static/admin/img/icon_changelink.gif diff --git a/django/contrib/admin/media/img/admin/icon_clock.gif b/django/contrib/admin/static/admin/img/icon_clock.gif Binary files differindex ff2d57e0a3..ff2d57e0a3 100644 --- a/django/contrib/admin/media/img/admin/icon_clock.gif +++ b/django/contrib/admin/static/admin/img/icon_clock.gif diff --git a/django/contrib/admin/media/img/admin/icon_cog.gif b/django/contrib/admin/static/admin/img/icon_cog.gif Binary files differindex e390ef2ef5..e390ef2ef5 100644 --- a/django/contrib/admin/media/img/admin/icon_cog.gif +++ b/django/contrib/admin/static/admin/img/icon_cog.gif diff --git a/django/contrib/admin/media/img/admin/icon_deletelink.gif b/django/contrib/admin/static/admin/img/icon_deletelink.gif Binary files differindex 72523e3a3b..72523e3a3b 100644 --- a/django/contrib/admin/media/img/admin/icon_deletelink.gif +++ b/django/contrib/admin/static/admin/img/icon_deletelink.gif diff --git a/django/contrib/admin/media/img/admin/icon_error.gif b/django/contrib/admin/static/admin/img/icon_error.gif Binary files differindex 3730a00b26..3730a00b26 100644 --- a/django/contrib/admin/media/img/admin/icon_error.gif +++ b/django/contrib/admin/static/admin/img/icon_error.gif diff --git a/django/contrib/admin/media/img/admin/icon_searchbox.png b/django/contrib/admin/static/admin/img/icon_searchbox.png Binary files differindex 8ab579e526..8ab579e526 100644 --- a/django/contrib/admin/media/img/admin/icon_searchbox.png +++ b/django/contrib/admin/static/admin/img/icon_searchbox.png diff --git a/django/contrib/admin/media/img/admin/icon_success.gif b/django/contrib/admin/static/admin/img/icon_success.gif Binary files differindex 5cf90a15aa..5cf90a15aa 100644 --- a/django/contrib/admin/media/img/admin/icon_success.gif +++ b/django/contrib/admin/static/admin/img/icon_success.gif diff --git a/django/contrib/admin/media/img/admin/inline-delete-8bit.png b/django/contrib/admin/static/admin/img/inline-delete-8bit.png Binary files differindex 95caf59a8d..95caf59a8d 100644 --- a/django/contrib/admin/media/img/admin/inline-delete-8bit.png +++ b/django/contrib/admin/static/admin/img/inline-delete-8bit.png diff --git a/django/contrib/admin/media/img/admin/inline-delete.png b/django/contrib/admin/static/admin/img/inline-delete.png Binary files differindex d59bcd2444..d59bcd2444 100644 --- a/django/contrib/admin/media/img/admin/inline-delete.png +++ b/django/contrib/admin/static/admin/img/inline-delete.png diff --git a/django/contrib/admin/media/img/admin/inline-restore-8bit.png b/django/contrib/admin/static/admin/img/inline-restore-8bit.png Binary files differindex e087c8ead3..e087c8ead3 100644 --- a/django/contrib/admin/media/img/admin/inline-restore-8bit.png +++ b/django/contrib/admin/static/admin/img/inline-restore-8bit.png diff --git a/django/contrib/admin/media/img/admin/inline-restore.png b/django/contrib/admin/static/admin/img/inline-restore.png Binary files differindex efdd92ac39..efdd92ac39 100644 --- a/django/contrib/admin/media/img/admin/inline-restore.png +++ b/django/contrib/admin/static/admin/img/inline-restore.png diff --git a/django/contrib/admin/media/img/admin/inline-splitter-bg.gif b/django/contrib/admin/static/admin/img/inline-splitter-bg.gif Binary files differindex 32ac5b3498..32ac5b3498 100644 --- a/django/contrib/admin/media/img/admin/inline-splitter-bg.gif +++ b/django/contrib/admin/static/admin/img/inline-splitter-bg.gif diff --git a/django/contrib/admin/media/img/admin/nav-bg-grabber.gif b/django/contrib/admin/static/admin/img/nav-bg-grabber.gif Binary files differindex 0a784fa769..0a784fa769 100644 --- a/django/contrib/admin/media/img/admin/nav-bg-grabber.gif +++ b/django/contrib/admin/static/admin/img/nav-bg-grabber.gif diff --git a/django/contrib/admin/media/img/admin/nav-bg-reverse.gif b/django/contrib/admin/static/admin/img/nav-bg-reverse.gif Binary files differindex f11029f90f..f11029f90f 100644 --- a/django/contrib/admin/media/img/admin/nav-bg-reverse.gif +++ b/django/contrib/admin/static/admin/img/nav-bg-reverse.gif diff --git a/django/contrib/admin/media/img/admin/nav-bg-selected.gif b/django/contrib/admin/static/admin/img/nav-bg-selected.gif Binary files differindex 98c5672ab3..98c5672ab3 100644 --- a/django/contrib/admin/media/img/admin/nav-bg-selected.gif +++ b/django/contrib/admin/static/admin/img/nav-bg-selected.gif diff --git a/django/contrib/admin/media/img/admin/nav-bg.gif b/django/contrib/admin/static/admin/img/nav-bg.gif Binary files differindex f8402b809d..f8402b809d 100644 --- a/django/contrib/admin/media/img/admin/nav-bg.gif +++ b/django/contrib/admin/static/admin/img/nav-bg.gif diff --git a/django/contrib/admin/media/img/admin/selector-add.gif b/django/contrib/admin/static/admin/img/selector-add.gif Binary files differindex 50132d1c43..50132d1c43 100644 --- a/django/contrib/admin/media/img/admin/selector-add.gif +++ b/django/contrib/admin/static/admin/img/selector-add.gif diff --git a/django/contrib/admin/media/img/admin/selector-addall.gif b/django/contrib/admin/static/admin/img/selector-addall.gif Binary files differindex d6e7c639bb..d6e7c639bb 100644 --- a/django/contrib/admin/media/img/admin/selector-addall.gif +++ b/django/contrib/admin/static/admin/img/selector-addall.gif diff --git a/django/contrib/admin/media/img/admin/selector-remove.gif b/django/contrib/admin/static/admin/img/selector-remove.gif Binary files differindex 2b9b0a2ac3..2b9b0a2ac3 100644 --- a/django/contrib/admin/media/img/admin/selector-remove.gif +++ b/django/contrib/admin/static/admin/img/selector-remove.gif diff --git a/django/contrib/admin/media/img/admin/selector-removeall.gif b/django/contrib/admin/static/admin/img/selector-removeall.gif Binary files differindex 5a4421926d..5a4421926d 100644 --- a/django/contrib/admin/media/img/admin/selector-removeall.gif +++ b/django/contrib/admin/static/admin/img/selector-removeall.gif diff --git a/django/contrib/admin/media/img/admin/selector-search.gif b/django/contrib/admin/static/admin/img/selector-search.gif Binary files differindex 6d5f4c7492..6d5f4c7492 100644 --- a/django/contrib/admin/media/img/admin/selector-search.gif +++ b/django/contrib/admin/static/admin/img/selector-search.gif diff --git a/django/contrib/admin/media/img/admin/selector_stacked-add.gif b/django/contrib/admin/static/admin/img/selector_stacked-add.gif Binary files differindex 7426169652..7426169652 100644 --- a/django/contrib/admin/media/img/admin/selector_stacked-add.gif +++ b/django/contrib/admin/static/admin/img/selector_stacked-add.gif diff --git a/django/contrib/admin/media/img/admin/selector_stacked-remove.gif b/django/contrib/admin/static/admin/img/selector_stacked-remove.gif Binary files differindex 60412cee19..60412cee19 100644 --- a/django/contrib/admin/media/img/admin/selector_stacked-remove.gif +++ b/django/contrib/admin/static/admin/img/selector_stacked-remove.gif diff --git a/django/contrib/admin/media/img/admin/tool-left.gif b/django/contrib/admin/static/admin/img/tool-left.gif Binary files differindex 011490ff3a..011490ff3a 100644 --- a/django/contrib/admin/media/img/admin/tool-left.gif +++ b/django/contrib/admin/static/admin/img/tool-left.gif diff --git a/django/contrib/admin/media/img/admin/tool-left_over.gif b/django/contrib/admin/static/admin/img/tool-left_over.gif Binary files differindex 937e07bb1a..937e07bb1a 100644 --- a/django/contrib/admin/media/img/admin/tool-left_over.gif +++ b/django/contrib/admin/static/admin/img/tool-left_over.gif diff --git a/django/contrib/admin/media/img/admin/tool-right.gif b/django/contrib/admin/static/admin/img/tool-right.gif Binary files differindex cdc140cc59..cdc140cc59 100644 --- a/django/contrib/admin/media/img/admin/tool-right.gif +++ b/django/contrib/admin/static/admin/img/tool-right.gif diff --git a/django/contrib/admin/media/img/admin/tool-right_over.gif b/django/contrib/admin/static/admin/img/tool-right_over.gif Binary files differindex 4db977e838..4db977e838 100644 --- a/django/contrib/admin/media/img/admin/tool-right_over.gif +++ b/django/contrib/admin/static/admin/img/tool-right_over.gif diff --git a/django/contrib/admin/media/img/admin/tooltag-add.gif b/django/contrib/admin/static/admin/img/tooltag-add.gif Binary files differindex 8b53d49ae5..8b53d49ae5 100644 --- a/django/contrib/admin/media/img/admin/tooltag-add.gif +++ b/django/contrib/admin/static/admin/img/tooltag-add.gif diff --git a/django/contrib/admin/media/img/admin/tooltag-add_over.gif b/django/contrib/admin/static/admin/img/tooltag-add_over.gif Binary files differindex bfc52f10de..bfc52f10de 100644 --- a/django/contrib/admin/media/img/admin/tooltag-add_over.gif +++ b/django/contrib/admin/static/admin/img/tooltag-add_over.gif diff --git a/django/contrib/admin/media/img/admin/tooltag-arrowright.gif b/django/contrib/admin/static/admin/img/tooltag-arrowright.gif Binary files differindex cdaaae77ed..cdaaae77ed 100644 --- a/django/contrib/admin/media/img/admin/tooltag-arrowright.gif +++ b/django/contrib/admin/static/admin/img/tooltag-arrowright.gif diff --git a/django/contrib/admin/media/img/admin/tooltag-arrowright_over.gif b/django/contrib/admin/static/admin/img/tooltag-arrowright_over.gif Binary files differindex 7163189604..7163189604 100644 --- a/django/contrib/admin/media/img/admin/tooltag-arrowright_over.gif +++ b/django/contrib/admin/static/admin/img/tooltag-arrowright_over.gif diff --git a/django/contrib/admin/media/js/LICENSE-JQUERY.txt b/django/contrib/admin/static/admin/js/LICENSE-JQUERY.txt index a4c5bd76ac..a4c5bd76ac 100644 --- a/django/contrib/admin/media/js/LICENSE-JQUERY.txt +++ b/django/contrib/admin/static/admin/js/LICENSE-JQUERY.txt diff --git a/django/contrib/admin/media/js/SelectBox.js b/django/contrib/admin/static/admin/js/SelectBox.js index f28c861513..f28c861513 100644 --- a/django/contrib/admin/media/js/SelectBox.js +++ b/django/contrib/admin/static/admin/js/SelectBox.js diff --git a/django/contrib/admin/media/js/SelectFilter2.js b/django/contrib/admin/static/admin/js/SelectFilter2.js index 92eff2ecfa..b7bc9d5f8f 100644 --- a/django/contrib/admin/media/js/SelectFilter2.js +++ b/django/contrib/admin/static/admin/js/SelectFilter2.js @@ -50,7 +50,7 @@ var SelectFilter = { var search_filter_label = quickElement('label', filter_p, '', 'for', field_id + "_input", 'style', 'width:16px;padding:2px'); - var search_selector_img = quickElement('img', search_filter_label, '', 'src', admin_media_prefix + 'img/admin/selector-search.gif'); + var search_selector_img = quickElement('img', search_filter_label, '', 'src', admin_media_prefix + 'img/selector-search.gif'); search_selector_img.alt = gettext("Filter"); filter_p.appendChild(document.createTextNode(' ')); @@ -75,7 +75,7 @@ var SelectFilter = { quickElement('h2', selector_chosen, interpolate(gettext('Chosen %s'), [field_name])); var selector_filter = quickElement('p', selector_chosen, gettext('Select your choice(s) and click ')); selector_filter.className = 'selector-filter'; - quickElement('img', selector_filter, '', 'src', admin_media_prefix + (is_stacked ? 'img/admin/selector_stacked-add.gif':'img/admin/selector-add.gif'), 'alt', 'Add'); + quickElement('img', selector_filter, '', 'src', admin_media_prefix + (is_stacked ? 'img/selector_stacked-add.gif':'img/selector-add.gif'), 'alt', 'Add'); var to_box = quickElement('select', selector_chosen, '', 'id', field_id + '_to', 'multiple', 'multiple', 'size', from_box.size, 'name', from_box.getAttribute('name')); to_box.className = 'filtered'; var clear_all = quickElement('a', selector_chosen, gettext('Clear all'), 'href', 'javascript: (function() { SelectBox.move_all("' + field_id + '_to", "' + field_id + '_from");})()'); diff --git a/django/contrib/admin/media/js/actions.js b/django/contrib/admin/static/admin/js/actions.js index 94aa6db934..94aa6db934 100644 --- a/django/contrib/admin/media/js/actions.js +++ b/django/contrib/admin/static/admin/js/actions.js diff --git a/django/contrib/admin/media/js/actions.min.js b/django/contrib/admin/static/admin/js/actions.min.js index 21f00cdab9..21f00cdab9 100644 --- a/django/contrib/admin/media/js/actions.min.js +++ b/django/contrib/admin/static/admin/js/actions.min.js diff --git a/django/contrib/admin/media/js/admin/DateTimeShortcuts.js b/django/contrib/admin/static/admin/js/admin/DateTimeShortcuts.js index a4293b305b..f22cc7a8ed 100644 --- a/django/contrib/admin/media/js/admin/DateTimeShortcuts.js +++ b/django/contrib/admin/static/admin/js/admin/DateTimeShortcuts.js @@ -50,7 +50,7 @@ var DateTimeShortcuts = { var clock_link = document.createElement('a'); clock_link.setAttribute('href', 'javascript:DateTimeShortcuts.openClock(' + num + ');'); clock_link.id = DateTimeShortcuts.clockLinkName + num; - quickElement('img', clock_link, '', 'src', DateTimeShortcuts.admin_media_prefix + 'img/admin/icon_clock.gif', 'alt', gettext('Clock')); + quickElement('img', clock_link, '', 'src', DateTimeShortcuts.admin_media_prefix + 'img/icon_clock.gif', 'alt', gettext('Clock')); shortcuts_span.appendChild(document.createTextNode('\240')); shortcuts_span.appendChild(now_link); shortcuts_span.appendChild(document.createTextNode('\240|\240')); @@ -138,7 +138,7 @@ var DateTimeShortcuts = { var cal_link = document.createElement('a'); cal_link.setAttribute('href', 'javascript:DateTimeShortcuts.openCalendar(' + num + ');'); cal_link.id = DateTimeShortcuts.calendarLinkName + num; - quickElement('img', cal_link, '', 'src', DateTimeShortcuts.admin_media_prefix + 'img/admin/icon_calendar.gif', 'alt', gettext('Calendar')); + quickElement('img', cal_link, '', 'src', DateTimeShortcuts.admin_media_prefix + 'img/icon_calendar.gif', 'alt', gettext('Calendar')); shortcuts_span.appendChild(document.createTextNode('\240')); shortcuts_span.appendChild(today_link); shortcuts_span.appendChild(document.createTextNode('\240|\240')); diff --git a/django/contrib/admin/media/js/admin/RelatedObjectLookups.js b/django/contrib/admin/static/admin/js/admin/RelatedObjectLookups.js index 1bc78f89b1..1bc78f89b1 100644 --- a/django/contrib/admin/media/js/admin/RelatedObjectLookups.js +++ b/django/contrib/admin/static/admin/js/admin/RelatedObjectLookups.js diff --git a/django/contrib/admin/media/js/admin/ordering.js b/django/contrib/admin/static/admin/js/admin/ordering.js index 53c42f3609..53c42f3609 100644 --- a/django/contrib/admin/media/js/admin/ordering.js +++ b/django/contrib/admin/static/admin/js/admin/ordering.js diff --git a/django/contrib/admin/media/js/calendar.js b/django/contrib/admin/static/admin/js/calendar.js index c95a95db1b..c95a95db1b 100644 --- a/django/contrib/admin/media/js/calendar.js +++ b/django/contrib/admin/static/admin/js/calendar.js diff --git a/django/contrib/admin/media/js/collapse.js b/django/contrib/admin/static/admin/js/collapse.js index 0a1e2d8893..0a1e2d8893 100644 --- a/django/contrib/admin/media/js/collapse.js +++ b/django/contrib/admin/static/admin/js/collapse.js diff --git a/django/contrib/admin/media/js/collapse.min.js b/django/contrib/admin/static/admin/js/collapse.min.js index 428984ee01..428984ee01 100644 --- a/django/contrib/admin/media/js/collapse.min.js +++ b/django/contrib/admin/static/admin/js/collapse.min.js diff --git a/django/contrib/admin/media/js/compress.py b/django/contrib/admin/static/admin/js/compress.py index 8d2caa28ea..8d2caa28ea 100644 --- a/django/contrib/admin/media/js/compress.py +++ b/django/contrib/admin/static/admin/js/compress.py diff --git a/django/contrib/admin/media/js/core.js b/django/contrib/admin/static/admin/js/core.js index 3ca8ad0f9a..3ca8ad0f9a 100644 --- a/django/contrib/admin/media/js/core.js +++ b/django/contrib/admin/static/admin/js/core.js diff --git a/django/contrib/admin/media/js/getElementsBySelector.js b/django/contrib/admin/static/admin/js/getElementsBySelector.js index 15b57a1908..15b57a1908 100644 --- a/django/contrib/admin/media/js/getElementsBySelector.js +++ b/django/contrib/admin/static/admin/js/getElementsBySelector.js diff --git a/django/contrib/admin/media/js/inlines.js b/django/contrib/admin/static/admin/js/inlines.js index bddd6f75ba..bddd6f75ba 100644 --- a/django/contrib/admin/media/js/inlines.js +++ b/django/contrib/admin/static/admin/js/inlines.js diff --git a/django/contrib/admin/media/js/inlines.min.js b/django/contrib/admin/static/admin/js/inlines.min.js index e8152ea357..e8152ea357 100644 --- a/django/contrib/admin/media/js/inlines.min.js +++ b/django/contrib/admin/static/admin/js/inlines.min.js diff --git a/django/contrib/admin/media/js/jquery.init.js b/django/contrib/admin/static/admin/js/jquery.init.js index 41b1051769..41b1051769 100644 --- a/django/contrib/admin/media/js/jquery.init.js +++ b/django/contrib/admin/static/admin/js/jquery.init.js diff --git a/django/contrib/admin/media/js/jquery.js b/django/contrib/admin/static/admin/js/jquery.js index fff6776433..fff6776433 100644 --- a/django/contrib/admin/media/js/jquery.js +++ b/django/contrib/admin/static/admin/js/jquery.js diff --git a/django/contrib/admin/media/js/jquery.min.js b/django/contrib/admin/static/admin/js/jquery.min.js index 7c24308023..7c24308023 100644 --- a/django/contrib/admin/media/js/jquery.min.js +++ b/django/contrib/admin/static/admin/js/jquery.min.js diff --git a/django/contrib/admin/media/js/prepopulate.js b/django/contrib/admin/static/admin/js/prepopulate.js index 24f24f95a8..24f24f95a8 100644 --- a/django/contrib/admin/media/js/prepopulate.js +++ b/django/contrib/admin/static/admin/js/prepopulate.js diff --git a/django/contrib/admin/media/js/prepopulate.min.js b/django/contrib/admin/static/admin/js/prepopulate.min.js index aa94937963..aa94937963 100644 --- a/django/contrib/admin/media/js/prepopulate.min.js +++ b/django/contrib/admin/static/admin/js/prepopulate.min.js diff --git a/django/contrib/admin/media/js/timeparse.js b/django/contrib/admin/static/admin/js/timeparse.js index 882f41d56e..882f41d56e 100644 --- a/django/contrib/admin/media/js/timeparse.js +++ b/django/contrib/admin/static/admin/js/timeparse.js diff --git a/django/contrib/admin/media/js/urlify.js b/django/contrib/admin/static/admin/js/urlify.js index d8f2549e27..d8f2549e27 100644 --- a/django/contrib/admin/media/js/urlify.js +++ b/django/contrib/admin/static/admin/js/urlify.js diff --git a/django/contrib/admin/templates/admin/auth/user/change_password.html b/django/contrib/admin/templates/admin/auth/user/change_password.html index 5a2036d1dc..c280f50d60 100644 --- a/django/contrib/admin/templates/admin/auth/user/change_password.html +++ b/django/contrib/admin/templates/admin/auth/user/change_password.html @@ -1,11 +1,11 @@ {% extends "admin/base_site.html" %} -{% load i18n admin_modify adminmedia %} +{% load i18n static admin_modify %} {% load url from future %} {% block extrahead %}{{ block.super }} {% url 'admin:jsi18n' as jsi18nurl %} <script type="text/javascript" src="{{ jsi18nurl|default:"../../../../jsi18n/" }}"></script> {% endblock %} -{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% admin_media_prefix %}css/forms.css" />{% endblock %} +{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}" />{% endblock %} {% block bodyclass %}{{ opts.app_label }}-{{ opts.object_name.lower }} change-form{% endblock %} {% block breadcrumbs %}{% if not is_popup %} <div class="breadcrumbs"> diff --git a/django/contrib/admin/templates/admin/base.html b/django/contrib/admin/templates/admin/base.html index d0f8e52753..9034ae8522 100644 --- a/django/contrib/admin/templates/admin/base.html +++ b/django/contrib/admin/templates/admin/base.html @@ -1,12 +1,12 @@ -{% load url from future %}<!DOCTYPE html> +{% load static %}{% load url from future %}<!DOCTYPE html> <html lang="{{ LANGUAGE_CODE|default:"en-us" }}" {% if LANGUAGE_BIDI %}dir="rtl"{% endif %}> <head> <title>{% block title %}{% endblock %}</title> -<link rel="stylesheet" type="text/css" href="{% block stylesheet %}{% load adminmedia %}{% admin_media_prefix %}css/base.css{% endblock %}" /> +<link rel="stylesheet" type="text/css" href="{% block stylesheet %}{% static "admin/css/base.css" %}{% endblock %}" /> {% block extrastyle %}{% endblock %} -<!--[if lte IE 7]><link rel="stylesheet" type="text/css" href="{% block stylesheet_ie %}{% load adminmedia %}{% admin_media_prefix %}css/ie.css{% endblock %}" /><![endif]--> -{% if LANGUAGE_BIDI %}<link rel="stylesheet" type="text/css" href="{% block stylesheet_rtl %}{% admin_media_prefix %}css/rtl.css{% endblock %}" />{% endif %} -<script type="text/javascript">window.__admin_media_prefix__ = "{% filter escapejs %}{% admin_media_prefix %}{% endfilter %}";</script> +<!--[if lte IE 7]><link rel="stylesheet" type="text/css" href="{% block stylesheet_ie %}{% static "admin/css/ie.css" %}{% endblock %}" /><![endif]--> +{% if LANGUAGE_BIDI %}<link rel="stylesheet" type="text/css" href="{% block stylesheet_rtl %}{% static "admin/css/rtl.css" %}{% endblock %}" />{% endif %} +<script type="text/javascript">window.__admin_media_prefix__ = "{% filter escapejs %}{% static "admin/" %}{% endfilter %}";</script> {% block extrahead %}{% endblock %} {% block blockbots %}<meta name="robots" content="NONE,NOARCHIVE" />{% endblock %} </head> diff --git a/django/contrib/admin/templates/admin/change_form.html b/django/contrib/admin/templates/admin/change_form.html index b32f76d2c2..c5e428d174 100644 --- a/django/contrib/admin/templates/admin/change_form.html +++ b/django/contrib/admin/templates/admin/change_form.html @@ -1,5 +1,5 @@ {% extends "admin/base_site.html" %} -{% load i18n admin_modify adminmedia %} +{% load i18n static admin_modify %} {% load url from future %} {% block extrahead %}{{ block.super }} @@ -8,7 +8,7 @@ {{ media }} {% endblock %} -{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% admin_media_prefix %}css/forms.css" />{% endblock %} +{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}" />{% endblock %} {% block coltype %}{% if ordered_objects %}colMS{% else %}colM{% endif %}{% endblock %} diff --git a/django/contrib/admin/templates/admin/change_list.html b/django/contrib/admin/templates/admin/change_list.html index 33b5201665..29af47ff79 100644 --- a/django/contrib/admin/templates/admin/change_list.html +++ b/django/contrib/admin/templates/admin/change_list.html @@ -1,11 +1,11 @@ {% extends "admin/base_site.html" %} -{% load adminmedia admin_list i18n %} +{% load i18n static admin_list %} {% load url from future %} {% block extrastyle %} {{ block.super }} - <link rel="stylesheet" type="text/css" href="{% admin_media_prefix %}css/changelists.css" /> + <link rel="stylesheet" type="text/css" href="{% static "admin/css/changelists.css" %}" /> {% if cl.formset %} - <link rel="stylesheet" type="text/css" href="{% admin_media_prefix %}css/forms.css" /> + <link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}" /> {% endif %} {% if cl.formset or action_form %} {% url 'admin:jsi18n' as jsi18nurl %} diff --git a/django/contrib/admin/templates/admin/change_list_results.html b/django/contrib/admin/templates/admin/change_list_results.html index 738ff28190..233d4e12d0 100644 --- a/django/contrib/admin/templates/admin/change_list_results.html +++ b/django/contrib/admin/templates/admin/change_list_results.html @@ -1,5 +1,4 @@ -{% load adminmedia %} -{% load i18n %} +{% load i18n static %} {% if result_hidden_fields %} <div class="hiddenfields">{# DIV for HTML validation #} {% for item in result_hidden_fields %}{{ item }}{% endfor %} @@ -16,7 +15,7 @@ <span class="text">{{ header.text|capfirst }}</span> {% if header.sortable %} {% if header.sort_pos > 0 %}<span class="sortpos"> - {% if header.sort_pos == 1 %}<img id="primary-sort-icon" src="{% admin_media_prefix %}img/admin/icon_cog.gif" alt="" /> {% endif %} + {% if header.sort_pos == 1 %}<img id="primary-sort-icon" src="{% static "admin/img/icon_cog.gif" %}" alt="" /> {% endif %} {{ header.sort_pos }}</span> {% endif %} <span class="clear"></span></a> diff --git a/django/contrib/admin/templates/admin/edit_inline/stacked.html b/django/contrib/admin/templates/admin/edit_inline/stacked.html index ff628c0bbf..7e69450866 100644 --- a/django/contrib/admin/templates/admin/edit_inline/stacked.html +++ b/django/contrib/admin/templates/admin/edit_inline/stacked.html @@ -1,4 +1,4 @@ -{% load i18n adminmedia %} +{% load i18n static %} <div class="inline-group" id="{{ inline_admin_formset.formset.prefix }}-group"> <h2>{{ inline_admin_formset.opts.verbose_name_plural|title }}</h2> {{ inline_admin_formset.formset.management_form }} @@ -40,11 +40,11 @@ if (typeof SelectFilter != "undefined"){ $(".selectfilter").each(function(index, value){ var namearr = value.name.split('-'); - SelectFilter.init(value.id, namearr[namearr.length-1], false, "{% admin_media_prefix %}"); + SelectFilter.init(value.id, namearr[namearr.length-1], false, "{% static "admin/" %}"); }); $(".selectfilterstacked").each(function(index, value){ var namearr = value.name.split('-'); - SelectFilter.init(value.id, namearr[namearr.length-1], true, "{% admin_media_prefix %}"); + SelectFilter.init(value.id, namearr[namearr.length-1], true, "{% static "admin/" %}"); }); } } diff --git a/django/contrib/admin/templates/admin/edit_inline/tabular.html b/django/contrib/admin/templates/admin/edit_inline/tabular.html index 5b9d2dca12..829422711d 100644 --- a/django/contrib/admin/templates/admin/edit_inline/tabular.html +++ b/django/contrib/admin/templates/admin/edit_inline/tabular.html @@ -1,4 +1,4 @@ -{% load i18n adminmedia admin_modify %} +{% load i18n static admin_modify %} <div class="inline-group" id="{{ inline_admin_formset.formset.prefix }}-group"> <div class="tabular inline-related {% if forloop.last %}last-related{% endif %}"> {{ inline_admin_formset.formset.management_form }} @@ -86,11 +86,11 @@ if (typeof SelectFilter != "undefined"){ $(".selectfilter").each(function(index, value){ var namearr = value.name.split('-'); - SelectFilter.init(value.id, namearr[namearr.length-1], false, "{% admin_media_prefix %}"); + SelectFilter.init(value.id, namearr[namearr.length-1], false, "{% static "admin/" %}"); }); $(".selectfilterstacked").each(function(index, value){ var namearr = value.name.split('-'); - SelectFilter.init(value.id, namearr[namearr.length-1], true, "{% admin_media_prefix %}"); + SelectFilter.init(value.id, namearr[namearr.length-1], true, "{% static "admin/" %}"); }); } } diff --git a/django/contrib/admin/templates/admin/index.html b/django/contrib/admin/templates/admin/index.html index d392f075ad..0f81a1a4fe 100644 --- a/django/contrib/admin/templates/admin/index.html +++ b/django/contrib/admin/templates/admin/index.html @@ -1,7 +1,7 @@ {% extends "admin/base_site.html" %} -{% load i18n %} +{% load i18n static %} -{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% load adminmedia %}{% admin_media_prefix %}css/dashboard.css" />{% endblock %} +{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/dashboard.css" %}" />{% endblock %} {% block coltype %}colMS{% endblock %} diff --git a/django/contrib/admin/templates/admin/login.html b/django/contrib/admin/templates/admin/login.html index ad7b14e965..a95cfd8e6b 100644 --- a/django/contrib/admin/templates/admin/login.html +++ b/django/contrib/admin/templates/admin/login.html @@ -1,7 +1,7 @@ {% extends "admin/base_site.html" %} -{% load i18n %} +{% load i18n static %} -{% block extrastyle %}{% load adminmedia %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% admin_media_prefix %}css/login.css" />{% endblock %} +{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/login.css" %}" />{% endblock %} {% block bodyclass %}login{% endblock %} diff --git a/django/contrib/admin/templates/admin/search_form.html b/django/contrib/admin/templates/admin/search_form.html index 3e14a110eb..2b23a215fb 100644 --- a/django/contrib/admin/templates/admin/search_form.html +++ b/django/contrib/admin/templates/admin/search_form.html @@ -1,9 +1,8 @@ -{% load adminmedia %} -{% load i18n %} +{% load i18n static %} {% if cl.search_fields %} <div id="toolbar"><form id="changelist-search" action="" method="get"> <div><!-- DIV needed for valid HTML --> -<label for="searchbar"><img src="{% admin_media_prefix %}img/admin/icon_searchbox.png" alt="Search" /></label> +<label for="searchbar"><img src="{% static "admin/img/icon_searchbox.png" %}" alt="Search" /></label> <input type="text" size="40" name="{{ search_var }}" value="{{ cl.query }}" id="searchbar" /> <input type="submit" value="{% trans 'Search' %}" /> {% if show_result_count %} diff --git a/django/contrib/admin/templates/registration/password_change_form.html b/django/contrib/admin/templates/registration/password_change_form.html index 23d6c1d8af..f76692d185 100644 --- a/django/contrib/admin/templates/registration/password_change_form.html +++ b/django/contrib/admin/templates/registration/password_change_form.html @@ -1,7 +1,7 @@ {% extends "admin/base_site.html" %} -{% load i18n adminmedia %} +{% load i18n static %} {% load url from future %} -{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% admin_media_prefix %}css/forms.css" />{% endblock %} +{% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}" />{% endblock %} {% block userlinks %}{% url 'django-admindocs-docroot' as docsroot %}{% if docsroot %}<a href="{{ docsroot }}">{% trans 'Documentation' %}</a> / {% endif %} {% trans 'Change password' %} / <a href="../logout/">{% trans 'Log out' %}</a>{% endblock %} {% block breadcrumbs %}<div class="breadcrumbs"><a href="../">{% trans 'Home' %}</a> › {% trans 'Password change' %}</div>{% endblock %} diff --git a/django/contrib/admin/templatetags/admin_list.py b/django/contrib/admin/templatetags/admin_list.py index c74657a13a..8efd06d497 100644 --- a/django/contrib/admin/templatetags/admin_list.py +++ b/django/contrib/admin/templatetags/admin_list.py @@ -6,6 +6,7 @@ from django.contrib.admin.views.main import (ALL_VAR, EMPTY_CHANGELIST_VALUE, ORDER_VAR, ORDER_TYPE_VAR, PAGE_VAR, SEARCH_VAR) from django.core.exceptions import ObjectDoesNotExist from django.db import models +from django.templatetags.static import static from django.utils import formats from django.utils.datastructures import SortedDict from django.utils.html import escape, conditional_escape @@ -154,9 +155,9 @@ def result_headers(cl): } def _boolean_icon(field_val): - BOOLEAN_MAPPING = {True: 'yes', False: 'no', None: 'unknown'} - return mark_safe(u'<img src="%simg/admin/icon-%s.gif" alt="%s" />' % - (settings.ADMIN_MEDIA_PREFIX, BOOLEAN_MAPPING[field_val], field_val)) + icon_url = static('admin/img/icon-%s.gif' % + {True: 'yes', False: 'no', None: 'unknown'}[field_val]) + return mark_safe(u'<img src="%s" alt="%s" />' % (icon_url, field_val)) def items_for_result(cl, result, form): """ diff --git a/django/contrib/admin/templatetags/adminmedia.py b/django/contrib/admin/templatetags/adminmedia.py index 3b1c39b3a7..753c180b02 100644 --- a/django/contrib/admin/templatetags/adminmedia.py +++ b/django/contrib/admin/templatetags/adminmedia.py @@ -1,3 +1,4 @@ +import warnings from django.template import Library from django.templatetags.static import PrefixNode @@ -8,4 +9,7 @@ def admin_media_prefix(): """ Returns the string contained in the setting ADMIN_MEDIA_PREFIX. """ + warnings.warn( + "The admin_media_prefix template tag is deprecated. " + "Use the static template tag instead.", PendingDeprecationWarning) return PrefixNode.handle_simple("ADMIN_MEDIA_PREFIX") diff --git a/django/contrib/admin/widgets.py b/django/contrib/admin/widgets.py index 957f94fd00..bf48f16e20 100644 --- a/django/contrib/admin/widgets.py +++ b/django/contrib/admin/widgets.py @@ -4,15 +4,16 @@ Form Widget classes specific to the Django admin site. import copy from django import forms +from django.conf import settings +from django.core.urlresolvers import reverse, NoReverseMatch from django.forms.widgets import RadioFieldRenderer from django.forms.util import flatatt +from django.templatetags.static import static from django.utils.html import escape from django.utils.text import truncate_words from django.utils.translation import ugettext as _ from django.utils.safestring import mark_safe from django.utils.encoding import force_unicode -from django.conf import settings -from django.core.urlresolvers import reverse, NoReverseMatch class FilteredSelectMultiple(forms.SelectMultiple): """ @@ -22,9 +23,8 @@ class FilteredSelectMultiple(forms.SelectMultiple): catalog has been loaded in the page """ class Media: - js = (settings.ADMIN_MEDIA_PREFIX + "js/core.js", - settings.ADMIN_MEDIA_PREFIX + "js/SelectBox.js", - settings.ADMIN_MEDIA_PREFIX + "js/SelectFilter2.js") + js = ["admin/js/%s" % path + for path in ["core.js", "SelectBox.js", "SelectFilter2.js"]] def __init__(self, verbose_name, is_stacked, attrs=None, choices=()): self.verbose_name = verbose_name @@ -39,22 +39,20 @@ class FilteredSelectMultiple(forms.SelectMultiple): output.append(u'<script type="text/javascript">addEvent(window, "load", function(e) {') # TODO: "id_" is hard-coded here. This should instead use the correct # API to determine the ID dynamically. - output.append(u'SelectFilter.init("id_%s", "%s", %s, "%s"); });</script>\n' % \ - (name, self.verbose_name.replace('"', '\\"'), int(self.is_stacked), settings.ADMIN_MEDIA_PREFIX)) + output.append(u'SelectFilter.init("id_%s", "%s", %s, "%s"); });</script>\n' + % (name, self.verbose_name.replace('"', '\\"'), int(self.is_stacked), static('admin/'))) return mark_safe(u''.join(output)) class AdminDateWidget(forms.DateInput): class Media: - js = (settings.ADMIN_MEDIA_PREFIX + "js/calendar.js", - settings.ADMIN_MEDIA_PREFIX + "js/admin/DateTimeShortcuts.js") + js = ["admin/js/calendar.js", "admin/js/admin/DateTimeShortcuts.js"] def __init__(self, attrs={}, format=None): super(AdminDateWidget, self).__init__(attrs={'class': 'vDateField', 'size': '10'}, format=format) class AdminTimeWidget(forms.TimeInput): class Media: - js = (settings.ADMIN_MEDIA_PREFIX + "js/calendar.js", - settings.ADMIN_MEDIA_PREFIX + "js/admin/DateTimeShortcuts.js") + js = ["admin/js/calendar.js", "admin/js/admin/DateTimeShortcuts.js"] def __init__(self, attrs={}, format=None): super(AdminTimeWidget, self).__init__(attrs={'class': 'vTimeField', 'size': '8'}, format=format) @@ -134,9 +132,10 @@ class ForeignKeyRawIdWidget(forms.TextInput): output = [super(ForeignKeyRawIdWidget, self).render(name, value, attrs)] # TODO: "id_" is hard-coded here. This should instead use the correct # API to determine the ID dynamically. - output.append(u'<a href="%s%s" class="related-lookup" id="lookup_id_%s" onclick="return showRelatedObjectLookupPopup(this);"> ' % \ - (related_url, url, name)) - output.append(u'<img src="%simg/admin/selector-search.gif" width="16" height="16" alt="%s" /></a>' % (settings.ADMIN_MEDIA_PREFIX, _('Lookup'))) + output.append(u'<a href="%s%s" class="related-lookup" id="lookup_id_%s" onclick="return showRelatedObjectLookupPopup(this);"> ' + % (related_url, url, name)) + output.append(u'<img src="%s" width="16" height="16" alt="%s" /></a>' + % (static('admin/img/selector-search.gif'), _('Lookup'))) if value: output.append(self.label_for_value(value)) return mark_safe(u''.join(output)) @@ -240,9 +239,10 @@ class RelatedFieldWidgetWrapper(forms.Widget): if self.can_add_related: # TODO: "id_" is hard-coded here. This should instead use the correct # API to determine the ID dynamically. - output.append(u'<a href="%s" class="add-another" id="add_id_%s" onclick="return showAddAnotherPopup(this);"> ' % \ - (related_url, name)) - output.append(u'<img src="%simg/admin/icon_addlink.gif" width="10" height="10" alt="%s"/></a>' % (settings.ADMIN_MEDIA_PREFIX, _('Add Another'))) + output.append(u'<a href="%s" class="add-another" id="add_id_%s" onclick="return showAddAnotherPopup(this);"> ' + % (related_url, name)) + output.append(u'<img src="%s" width="10" height="10" alt="%s"/></a>' + % (static('admin/img/icon_addlink.gif'), _('Add Another'))) return mark_safe(u''.join(output)) def build_attrs(self, extra_attrs=None, **kwargs): diff --git a/django/contrib/gis/admin/widgets.py b/django/contrib/gis/admin/widgets.py index be26261b54..49de09511d 100644 --- a/django/contrib/gis/admin/widgets.py +++ b/django/contrib/gis/admin/widgets.py @@ -1,15 +1,16 @@ from django.conf import settings -from django.contrib.gis.gdal import OGRException -from django.contrib.gis.geos import GEOSGeometry, GEOSException from django.forms.widgets import Textarea from django.template import loader, Context +from django.templatetags.static import static from django.utils import translation +from django.contrib.gis.gdal import OGRException +from django.contrib.gis.geos import GEOSGeometry, GEOSException + # Creating a template context that contains Django settings # values needed by admin map templates. -geo_context = Context({'ADMIN_MEDIA_PREFIX' : settings.ADMIN_MEDIA_PREFIX, - 'LANGUAGE_BIDI' : translation.get_language_bidi(), - }) +geo_context = Context({'ADMIN_MEDIA_PREFIX' : static('admin/'), + 'LANGUAGE_BIDI' : translation.get_language_bidi()}) class OpenLayersWidget(Textarea): """ diff --git a/django/contrib/gis/templates/gis/admin/openlayers.html b/django/contrib/gis/templates/gis/admin/openlayers.html index 4292eb6474..a61b68921f 100644 --- a/django/contrib/gis/templates/gis/admin/openlayers.html +++ b/django/contrib/gis/templates/gis/admin/openlayers.html @@ -1,15 +1,16 @@ {% block extrastyle %} +{% load static %} <style type="text/css"> #{{ id }}_map { width: {{ map_width }}px; height: {{ map_height }}px; } #{{ id }}_map .aligned label { float:inherit; } #{{ id }}_admin_map { position: relative; vertical-align: top; float: {{ LANGUAGE_BIDI|yesno:"right,left" }}; } {% if not display_wkt %}#{{ id }} { display: none; }{% endif %} .olControlEditingToolbar .olControlModifyFeatureItemActive { - background-image: url("{{ ADMIN_MEDIA_PREFIX }}img/gis/move_vertex_on.png"); + background-image: url("{% static "admin/img/gis/move_vertex_on.png" %}"); background-repeat: no-repeat; } .olControlEditingToolbar .olControlModifyFeatureItemInactive { - background-image: url("{{ ADMIN_MEDIA_PREFIX }}img/gis/move_vertex_off.png"); + background-image: url("{% static "admin/img/gis/move_vertex_off.png" %}"); background-repeat: no-repeat; } </style> diff --git a/django/contrib/staticfiles/storage.py b/django/contrib/staticfiles/storage.py index 455be7bcc2..a69ae239df 100644 --- a/django/contrib/staticfiles/storage.py +++ b/django/contrib/staticfiles/storage.py @@ -43,14 +43,7 @@ class AppStaticStorage(FileSystemStorage): Returns a static file storage if available in the given app. """ # app is the actual app module - self.app_module = app - # We special case the admin app here since it has its static files - # in 'media' for historic reasons. - if self.app_module == 'django.contrib.admin': - self.prefix = 'admin' - self.source_dir = 'media' - mod = import_module(self.app_module) + mod = import_module(app) mod_path = os.path.dirname(mod.__file__) location = os.path.join(mod_path, self.source_dir) super(AppStaticStorage, self).__init__(location, *args, **kwargs) - diff --git a/django/core/servers/basehttp.py b/django/core/servers/basehttp.py index c4c45111fb..b6c8d55c87 100644 --- a/django/core/servers/basehttp.py +++ b/django/core/servers/basehttp.py @@ -12,6 +12,7 @@ import socket import sys import traceback import urllib +import urlparse from SocketServer import ThreadingMixIn from wsgiref import simple_server from wsgiref.util import FileWrapper # for backwards compatibility @@ -91,7 +92,7 @@ class WSGIRequestHandler(simple_server.WSGIRequestHandler, object): def __init__(self, *args, **kwargs): from django.conf import settings - self.admin_media_prefix = settings.ADMIN_MEDIA_PREFIX + self.admin_media_prefix = urlparse.urljoin(settings.STATIC_URL, 'admin/') # We set self.path to avoid crashes in log_message() on unsupported # requests (like "OPTIONS"). self.path = '' @@ -163,22 +164,18 @@ class WSGIRequestHandler(simple_server.WSGIRequestHandler, object): class AdminMediaHandler(handlers.StaticFilesHandler): """ WSGI middleware that intercepts calls to the admin media directory, as - defined by the ADMIN_MEDIA_PREFIX setting, and serves those images. + defined by the STATIC_URL setting, and serves those images. Use this ONLY LOCALLY, for development! This hasn't been tested for security and is not super efficient. This is pending for deprecation since 1.3. """ def get_base_dir(self): - return os.path.join(django.__path__[0], 'contrib', 'admin', 'media') + return os.path.join(django.__path__[0], 'contrib', 'admin', 'static', 'admin') def get_base_url(self): from django.conf import settings - if not settings.ADMIN_MEDIA_PREFIX: - raise ImproperlyConfigured( - "The ADMIN_MEDIA_PREFIX setting can't be empty " - "when using the AdminMediaHandler, e.g. with runserver.") - return settings.ADMIN_MEDIA_PREFIX + return urlparse.urljoin(settings.STATIC_URL, 'admin/') def file_path(self, url): """ diff --git a/django/templatetags/static.py b/django/templatetags/static.py index 97d657189b..cba44378c3 100644 --- a/django/templatetags/static.py +++ b/django/templatetags/static.py @@ -1,3 +1,4 @@ +from urlparse import urljoin from django import template from django.utils.encoding import iri_to_uri @@ -68,7 +69,7 @@ def get_static_prefix(parser, token): @register.tag def get_media_prefix(parser, token): """ - Populates a template variable with the static prefix, + Populates a template variable with the media prefix, ``settings.MEDIA_URL``. Usage:: @@ -82,3 +83,20 @@ def get_media_prefix(parser, token): """ return PrefixNode.handle_token(parser, token, "MEDIA_URL") + +@register.simple_tag +def static(path): + """ + Joins the given path with the STATIC_URL setting. + + Usage:: + + {% static path %} + + Examples:: + + {% static "myapp/css/base.css" %} + {% static variable_with_path %} + + """ + return urljoin(PrefixNode.handle_simple("STATIC_URL"), path) diff --git a/docs/howto/static-files.txt b/docs/howto/static-files.txt index 3d2a37e972..1b206eb1aa 100644 --- a/docs/howto/static-files.txt +++ b/docs/howto/static-files.txt @@ -183,18 +183,34 @@ To see how that works, and to read more details, check out With a template tag ------------------- -The second option is the :ttag:`get_static_prefix` template tag. You can -use this if you're not using :class:`~django.template.RequestContext`, or if you -need more control over exactly where and how :setting:`STATIC_URL` is -injected into the template. Here's an example: +To easily link to static files Django ships with a :ttag:`static` template tag. + +.. code-block:: html+django + + {% load static %} + <img src="{% static "images/hi.jpg" %}" /> + +It is also able to consume standard context variables, e.g. assuming a +``user_stylesheet`` variable is passed to the template: + +.. code-block:: html+django + + {% load static %} + <link rel="stylesheet" href="{% static user_stylesheet %}" type="text/css" media="screen" /> + +Another option is the :ttag:`get_static_prefix` template tag. You can use +this if you're not using :class:`~django.template.RequestContext` (and +therefore not relying on the ``django.core.context_processors.static`` +context processor), or if you need more control over exactly where and how +:setting:`STATIC_URL` is injected into the template. Here's an example: .. code-block:: html+django {% load static %} <img src="{% get_static_prefix %}images/hi.jpg" /> -There's also a second form you can use to avoid extra processing if you need the -value multiple times: +There's also a second form you can use to avoid extra processing if you need +the value multiple times: .. code-block:: html+django diff --git a/docs/internals/deprecation.txt b/docs/internals/deprecation.txt index cd65a89e22..c20d5bec82 100644 --- a/docs/internals/deprecation.txt +++ b/docs/internals/deprecation.txt @@ -215,6 +215,11 @@ their deprecation, as per the :ref:`Django deprecation policy :setting:`LOGGING` setting should include this filter explicitly if it is desired. + * The template tag + :func:`django.contrib.admin.templatetags.adminmedia.admin_media_prefix` + was deprecated since Django 1.4 and will be removed in favor of the + generic static files handling. + * 2.0 * ``django.views.defaults.shortcut()``. This function has been moved to ``django.contrib.contenttypes.views.shortcut()`` as part of the diff --git a/docs/ref/contrib/staticfiles.txt b/docs/ref/contrib/staticfiles.txt index eb8bbec105..4c243a349a 100644 --- a/docs/ref/contrib/staticfiles.txt +++ b/docs/ref/contrib/staticfiles.txt @@ -228,42 +228,23 @@ Example usage:: Other Helpers ============= -The ``static`` context processor --------------------------------- +There are a few other helpers outside of the +:mod:`staticfiles <django.contrib.staticfiles>` app to work with static +files: -.. function:: django.core.context_processors.static + - The :func:`django.core.context_processors.static` context processor + which adds :setting:`STATIC_URL` to every template context rendered + with :class:`~django.template.RequestContext` contexts. -This context processor adds the :setting:`STATIC_URL` into each template -context as the variable ``{{ STATIC_URL }}``. To use it, make sure that -``'django.core.context_processors.static'`` appears somewhere in your -:setting:`TEMPLATE_CONTEXT_PROCESSORS` setting. + - The builtin template tag :ttag:`static` which takes a path and + joins it with the the static prefix :setting:`STATIC_URL`. -Remember, only templates rendered with :class:`~django.template.RequestContext` -will have acces to the data provided by this (and any) context processor. + - The builtin template tag :ttag:`get_static_prefix` which populates a + template variable with the static prefix :setting:`STATIC_URL` to be + used as a variable or directly. -.. templatetag:: get_static_prefix - -The ``get_static_prefix`` templatetag -===================================== - -.. highlight:: html+django - -If you're not using :class:`~django.template.RequestContext`, or if you need -more control over exactly where and how :setting:`STATIC_URL` is injected -into the template, you can use the :ttag:`get_static_prefix` template tag -instead:: - - {% load static %} - <img src="{% get_static_prefix %}images/hi.jpg" /> - -There's also a second form you can use to avoid extra processing if you need -the value multiple times:: - - {% load static %} - {% get_static_prefix as STATIC_PREFIX %} - - <img src="{{ STATIC_PREFIX }}images/hi.jpg" /> - <img src="{{ STATIC_PREFIX }}images/hi2.jpg" /> + - The similar template tag :ttag:`get_media_prefix` which works like + :ttag:`get_static_prefix` but uses :setting:`MEDIA_URL`. .. _staticfiles-development-view: diff --git a/docs/ref/settings.txt b/docs/ref/settings.txt index e95c165a9a..c09b218198 100644 --- a/docs/ref/settings.txt +++ b/docs/ref/settings.txt @@ -44,20 +44,6 @@ modules (in the format ``'foo.bar.baz'``) for which this site is an admin. The admin site uses this in its automatically-introspected documentation of models, views and template tags. -.. setting:: ADMIN_MEDIA_PREFIX - -ADMIN_MEDIA_PREFIX ------------------- - -Default: ``'/static/admin/'`` - -The URL prefix for admin media -- CSS, JavaScript and images used by the Django -administrative interface. Make sure to use a trailing slash, and to have this be -different from the :setting:`MEDIA_URL` setting (since the same URL cannot be -mapped onto two different sets of files). For integration with :doc:`staticfiles -</ref/contrib/staticfiles>`, this should be the same as -:setting:`STATIC_URL` followed by ``'admin/'``. - .. setting:: ADMINS ADMINS diff --git a/docs/ref/templates/api.txt b/docs/ref/templates/api.txt index 2ca08b1fd9..c8100fc0f9 100644 --- a/docs/ref/templates/api.txt +++ b/docs/ref/templates/api.txt @@ -479,6 +479,8 @@ value of the :setting:`MEDIA_URL` setting. django.core.context_processors.static ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +.. function:: django.core.context_processors.static + .. versionadded:: 1.3 If :setting:`TEMPLATE_CONTEXT_PROCESSORS` contains this processor, every diff --git a/docs/ref/templates/builtins.txt b/docs/ref/templates/builtins.txt index ed0092f9ca..3ab8a5d73f 100644 --- a/docs/ref/templates/builtins.txt +++ b/docs/ref/templates/builtins.txt @@ -17,7 +17,7 @@ Built-in tag reference .. templatetag:: autoescape autoescape -~~~~~~~~~~ +^^^^^^^^^^ Control the current auto-escaping behavior. This tag takes either ``on`` or ``off`` as an argument and that determines whether auto-escaping is in effect @@ -41,7 +41,7 @@ Sample usage:: .. templatetag:: block block -~~~~~ +^^^^^ Define a block that can be overridden by child templates. See :ref:`Template inheritance <template-inheritance>` for more information. @@ -49,14 +49,14 @@ Define a block that can be overridden by child templates. See .. templatetag:: comment comment -~~~~~~~ +^^^^^^^ Ignore everything between ``{% comment %}`` and ``{% endcomment %}`` .. templatetag:: csrf_token csrf_token -~~~~~~~~~~ +^^^^^^^^^^ In the Django 1.1.X series, this is a no-op tag that returns an empty string for future compatibility purposes. In Django 1.2 and later, it is used for CSRF @@ -66,7 +66,7 @@ Forgeries </ref/contrib/csrf>`. .. templatetag:: cycle cycle -~~~~~ +^^^^^ Cycle among the given strings or variables each time this tag is encountered. @@ -187,7 +187,7 @@ call to ``{% cycle %}`` doesn't specify silent:: .. templatetag:: debug debug -~~~~~ +^^^^^ Output a whole load of debugging information, including the current context and imported modules. @@ -195,7 +195,7 @@ imported modules. .. templatetag:: extends extends -~~~~~~~ +^^^^^^^ Signal that this template extends a parent template. @@ -214,7 +214,7 @@ See :ref:`template-inheritance` for more information. .. templatetag:: filter filter -~~~~~~ +^^^^^^ Filter the contents of the variable through variable filters. @@ -230,7 +230,7 @@ Sample usage:: .. templatetag:: firstof firstof -~~~~~~~ +^^^^^^^ Outputs the first variable passed that is not False, without escaping. @@ -270,7 +270,7 @@ explicitly:: .. templatetag:: for for -~~~ +^^^ Loop over each item in an array. For example, to display a list of athletes provided in ``athlete_list``:: @@ -347,7 +347,7 @@ than -- the following:: .. templatetag:: if if -~~ +^^ The ``{% if %}`` tag evaluates a variable, and if that variable is "true" (i.e. exists, is not empty, and is not a false boolean value) the contents of the @@ -551,7 +551,7 @@ precedence rules. .. templatetag:: ifchanged ifchanged -~~~~~~~~~ +^^^^^^^^^ Check if a value has changed from the last iteration of a loop. @@ -595,7 +595,7 @@ will be displayed if the value has not changed:: .. templatetag:: ifequal ifequal -~~~~~~~ +^^^^^^^ Output the contents of the block if the two arguments equal each other. @@ -624,7 +624,7 @@ tag instead. .. templatetag:: ifnotequal ifnotequal -~~~~~~~~~~ +^^^^^^^^^^ Just like ``ifequal``, except it tests that the two arguments are not equal. @@ -634,7 +634,7 @@ Just like ``ifequal``, except it tests that the two arguments are not equal. .. templatetag:: include include -~~~~~~~ +^^^^^^^ Loads a template and renders it with the current context. This is a way of "including" other templates within a template. @@ -687,7 +687,7 @@ See also: ``{% ssi %}``. .. templatetag:: load load -~~~~ +^^^^ Load a custom template tag set. @@ -710,7 +710,7 @@ more information. .. templatetag:: now now -~~~ +^^^ Display the current date and/or time, using a format according to the given string. Such string can contain format specifiers characters as described @@ -744,7 +744,7 @@ This would display as "It is the 4th of September". .. templatetag:: regroup regroup -~~~~~~~ +^^^^^^^ Regroup a list of alike objects by a common attribute. @@ -855,7 +855,7 @@ an attribute "description," you could use:: {% regroup people by gender.description as gender_list %} Or, if ``gender`` is a field with ``choices``, it will have a -:meth:`~django.db.models.Model.get_FOO_display` method available as an +:meth:`^django.db.models.Model.get_FOO_display` method available as an attribute, allowing you to group on the display string rather than the ``choices`` key:: @@ -867,7 +867,7 @@ attribute, allowing you to group on the display string rather than the .. templatetag:: spaceless spaceless -~~~~~~~~~ +^^^^^^^^^ Removes whitespace between HTML tags. This includes tab characters and newlines. @@ -896,7 +896,7 @@ this example, the space around ``Hello`` won't be stripped:: .. templatetag:: ssi ssi -~~~ +^^^ Output the contents of a given file into the page. @@ -943,7 +943,7 @@ See also: ``{% include %}``. .. templatetag:: templatetag templatetag -~~~~~~~~~~~ +^^^^^^^^^^^ Output one of the syntax characters used to compose template tags. @@ -968,7 +968,7 @@ The argument tells which template bit to output: .. templatetag:: url url -~~~ +^^^ Returns an absolute path reference (a URL without the domain name) matching a given view function and optional parameters. This is a way to output links @@ -1014,7 +1014,7 @@ refer to the name of the pattern in the ``url`` tag instead of using the path to the view. Note that if the URL you're reversing doesn't exist, you'll get an -:exc:`~django.core.urlresolvers.NoReverseMatch` exception raised, which will +:exc:`^django.core.urlresolvers.NoReverseMatch` exception raised, which will cause your site to display an error page. If you'd like to retrieve a URL without displaying it, you can use a slightly @@ -1097,7 +1097,7 @@ projects? .. templatetag:: widthratio widthratio -~~~~~~~~~~ +^^^^^^^^^^ For creating bar charts and such, this tag calculates the ratio of a given value to a maximum value, and then applies that ratio to a constant. @@ -1113,7 +1113,7 @@ which is rounded up to 88). .. templatetag:: with with -~~~~ +^^^^ .. versionchanged:: 1.3 New keyword argument format and multiple variable assignments. @@ -1147,7 +1147,7 @@ Built-in filter reference .. templatefilter:: add add -~~~ +^^^ Adds the argument to the value. @@ -1180,7 +1180,7 @@ output will be ``[1, 2, 3, 4, 5, 6]``. .. templatefilter:: addslashes addslashes -~~~~~~~~~~ +^^^^^^^^^^ Adds slashes before quotes. Useful for escaping strings in CSV, for example. @@ -1193,7 +1193,7 @@ If ``value`` is ``"I'm using Django"``, the output will be ``"I\'m using Django" .. templatefilter:: capfirst capfirst -~~~~~~~~ +^^^^^^^^ Capitalizes the first character of the value. @@ -1206,7 +1206,7 @@ If ``value`` is ``"django"``, the output will be ``"Django"``. .. templatefilter:: center center -~~~~~~ +^^^^^^ Centers the value in a field of a given width. @@ -1219,7 +1219,7 @@ If ``value`` is ``"Django"``, the output will be ``" Django "``. .. templatefilter:: cut cut -~~~ +^^^ Removes all values of arg from the given string. @@ -1232,7 +1232,7 @@ If ``value`` is ``"String with spaces"``, the output will be ``"Stringwithspaces .. templatefilter:: date date -~~~~ +^^^^ Formats a date according to the given format. @@ -1346,7 +1346,7 @@ used, without applying any localization. .. templatefilter:: default default -~~~~~~~ +^^^^^^^ If value evaluates to ``False``, use given default. Otherwise, use the value. @@ -1359,7 +1359,7 @@ If ``value`` is ``""`` (the empty string), the output will be ``nothing``. .. templatefilter:: default_if_none default_if_none -~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^ If (and only if) value is ``None``, use given default. Otherwise, use the value. @@ -1376,7 +1376,7 @@ If ``value`` is ``None``, the output will be the string ``"nothing"``. .. templatefilter:: dictsort dictsort -~~~~~~~~ +^^^^^^^^ Takes a list of dictionaries and returns that list sorted by the key given in the argument. @@ -1408,7 +1408,7 @@ then the output would be: .. templatefilter:: dictsortreversed dictsortreversed -~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^ Takes a list of dictionaries and returns that list sorted in reverse order by the key given in the argument. This works exactly the same as the above filter, @@ -1417,7 +1417,7 @@ but the returned value will be in reverse order. .. templatefilter:: divisibleby divisibleby -~~~~~~~~~~~ +^^^^^^^^^^^ Returns ``True`` if the value is divisible by the argument. @@ -1430,7 +1430,7 @@ If ``value`` is ``21``, the output would be ``True``. .. templatefilter:: escape escape -~~~~~~ +^^^^^^ Escapes a string's HTML. Specifically, it makes these replacements: @@ -1453,7 +1453,7 @@ multiple escaping passes to be applied, use the ``force_escape`` filter. .. templatefilter:: escapejs escapejs -~~~~~~~~ +^^^^^^^^ Escapes characters for use in JavaScript strings. This does *not* make the string safe for use in HTML, but does protect you from syntax errors when using @@ -1469,7 +1469,7 @@ the output will be ``"testing\\u000D\\u000Ajavascript \\u0027string\\u0022 \\u00 .. templatefilter:: filesizeformat filesizeformat -~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^ Format the value like a 'human-readable' file size (i.e. ``'13 KB'``, ``'4.1 MB'``, ``'102 bytes'``, etc). @@ -1483,7 +1483,7 @@ If ``value`` is 123456789, the output would be ``117.7 MB``. .. templatefilter:: first first -~~~~~ +^^^^^ Returns the first item in a list. @@ -1496,7 +1496,7 @@ If ``value`` is the list ``['a', 'b', 'c']``, the output will be ``'a'``. .. templatefilter:: fix_ampersands fix_ampersands -~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^ .. note:: @@ -1521,7 +1521,7 @@ resembles a named entity. .. templatefilter:: floatformat floatformat -~~~~~~~~~~~ +^^^^^^^^^^^ When used without an argument, rounds a floating-point number to one decimal place -- but only if there's a decimal part to be displayed. For example: @@ -1563,7 +1563,7 @@ with an argument of ``-1``. .. templatefilter:: force_escape force_escape -~~~~~~~~~~~~ +^^^^^^^^^^^^ Applies HTML escaping to a string (see the ``escape`` filter for details). This filter is applied *immediately* and returns a new, escaped string. This @@ -1574,7 +1574,7 @@ filter. .. templatefilter:: get_digit get_digit -~~~~~~~~~ +^^^^^^^^^ Given a whole number, returns the requested digit, where 1 is the right-most digit, 2 is the second-right-most digit, etc. Returns the original value for @@ -1590,7 +1590,7 @@ If ``value`` is ``123456789``, the output will be ``8``. .. templatefilter:: iriencode iriencode -~~~~~~~~~ +^^^^^^^^^ Converts an IRI (Internationalized Resource Identifier) to a string that is suitable for including in a URL. This is necessary if you're trying to use @@ -1608,7 +1608,7 @@ If ``value`` is ``"?test=1&me=2"``, the output will be ``"?test=1&me=2"``. .. templatefilter:: join join -~~~~ +^^^^ Joins a list with a string, like Python's ``str.join(list)`` @@ -1622,7 +1622,7 @@ If ``value`` is the list ``['a', 'b', 'c']``, the output will be the string .. templatefilter:: last last -~~~~ +^^^^ Returns the last item in a list. @@ -1636,7 +1636,7 @@ If ``value`` is the list ``['a', 'b', 'c', 'd']``, the output will be the string .. templatefilter:: length length -~~~~~~ +^^^^^^ Returns the length of the value. This works for both strings and lists. @@ -1649,7 +1649,7 @@ If ``value`` is ``['a', 'b', 'c', 'd']``, the output will be ``4``. .. templatefilter:: length_is length_is -~~~~~~~~~ +^^^^^^^^^ Returns ``True`` if the value's length is the argument, or ``False`` otherwise. @@ -1662,7 +1662,7 @@ If ``value`` is ``['a', 'b', 'c', 'd']``, the output will be ``True``. .. templatefilter:: linebreaks linebreaks -~~~~~~~~~~ +^^^^^^^^^^ Replaces line breaks in plain text with appropriate HTML; a single newline becomes an HTML line break (``<br />``) and a new line @@ -1678,7 +1678,7 @@ slug</p>``. .. templatefilter:: linebreaksbr linebreaksbr -~~~~~~~~~~~~ +^^^^^^^^^^^^ Converts all newlines in a piece of plain text to HTML line breaks (``<br />``). @@ -1693,7 +1693,7 @@ slug``. .. templatefilter:: linenumbers linenumbers -~~~~~~~~~~~ +^^^^^^^^^^^ Displays text with line numbers. @@ -1716,7 +1716,7 @@ the output will be:: .. templatefilter:: ljust ljust -~~~~~ +^^^^^ Left-aligns the value in a field of a given width. @@ -1731,7 +1731,7 @@ If ``value`` is ``Django``, the output will be ``"Django "``. .. templatefilter:: lower lower -~~~~~ +^^^^^ Converts a string into all lowercase. @@ -1744,7 +1744,7 @@ If ``value`` is ``Still MAD At Yoko``, the output will be ``still mad at yoko``. .. templatefilter:: make_list make_list -~~~~~~~~~ +^^^^^^^^^ Returns the value turned into a list. For a string, it's a list of characters. For an integer, the argument is cast into an unicode string before creating a @@ -1761,7 +1761,7 @@ list ``[u'1', u'2', u'3']``. .. templatefilter:: phone2numeric phone2numeric -~~~~~~~~~~~~~ +^^^^^^^^^^^^^ Converts a phone number (possibly containing letters) to its numerical equivalent. @@ -1778,7 +1778,7 @@ If ``value`` is ``800-COLLECT``, the output will be ``800-2655328``. .. templatefilter:: pluralize pluralize -~~~~~~~~~ +^^^^^^^^^ Returns a plural suffix if the value is not 1. By default, this suffix is ``'s'``. @@ -1808,7 +1808,7 @@ Example:: .. templatefilter:: pprint pprint -~~~~~~ +^^^^^^ A wrapper around `pprint.pprint`__ -- for debugging, really. @@ -1817,7 +1817,7 @@ __ http://docs.python.org/library/pprint.html .. templatefilter:: random random -~~~~~~ +^^^^^^ Returns a random item from the given list. @@ -1830,7 +1830,7 @@ If ``value`` is the list ``['a', 'b', 'c', 'd']``, the output could be ``"b"``. .. templatefilter:: removetags removetags -~~~~~~~~~~ +^^^^^^^^^^ Removes a space-separated list of [X]HTML tags from the output. @@ -1849,7 +1849,7 @@ output will be ``"<B>Joel</B> <button>is</button> a slug"``. .. templatefilter:: rjust rjust -~~~~~ +^^^^^ Right-aligns the value in a field of a given width. @@ -1864,7 +1864,7 @@ If ``value`` is ``Django``, the output will be ``" Django"``. .. templatefilter:: safe safe -~~~~ +^^^^ Marks a string as not requiring further HTML escaping prior to output. When autoescaping is off, this filter has no effect. @@ -1882,7 +1882,7 @@ autoescaping is off, this filter has no effect. .. templatefilter:: safeseq safeseq -~~~~~~~ +^^^^^^^ Applies the :tfilter:`safe` filter to each element of a sequence. Useful in conjunction with other filters that operate on sequences, such as @@ -1897,7 +1897,7 @@ individual elements of the sequence. .. templatefilter:: slice slice -~~~~~ +^^^^^ Returns a slice of the list. @@ -1914,7 +1914,7 @@ If ``some_list`` is ``['a', 'b', 'c']``, the output will be ``['a', 'b']``. .. templatefilter:: slugify slugify -~~~~~~~ +^^^^^^^ Converts to lowercase, removes non-word characters (alphanumerics and underscores) and converts spaces to hyphens. Also strips leading and trailing @@ -1929,7 +1929,7 @@ If ``value`` is ``"Joel is a slug"``, the output will be ``"joel-is-a-slug"``. .. templatefilter:: stringformat stringformat -~~~~~~~~~~~~ +^^^^^^^^^^^^ Formats the variable according to the argument, a string formatting specifier. This specifier uses Python string formatting syntax, with the exception that @@ -1947,7 +1947,7 @@ If ``value`` is ``"Joel is a slug"``, the output will be ``"Joel is a slug"``. .. templatefilter:: striptags striptags -~~~~~~~~~ +^^^^^^^^^ Strips all [X]HTML tags. @@ -1961,7 +1961,7 @@ output will be ``"Joel is a slug"``. .. templatefilter:: time time -~~~~ +^^^^ Formats a time according to the given format. @@ -2003,7 +2003,7 @@ used, without applying any localization. .. templatefilter:: timesince timesince -~~~~~~~~~ +^^^^^^^^^ Formats a date as the time since that date (e.g., "4 days, 6 hours"). @@ -2021,7 +2021,7 @@ date that is in the future relative to the comparison point. .. templatefilter:: timeuntil timeuntil -~~~~~~~~~ +^^^^^^^^^ Similar to ``timesince``, except that it measures the time from now until the given date or datetime. For example, if today is 1 June 2006 and @@ -2040,7 +2040,7 @@ date that is in the past relative to the comparison point. .. templatefilter:: title title -~~~~~ +^^^^^ Converts a string into titlecase. @@ -2053,7 +2053,7 @@ If ``value`` is ``"my first post"``, the output will be ``"My First Post"``. .. templatefilter:: truncatewords truncatewords -~~~~~~~~~~~~~ +^^^^^^^^^^^^^ Truncates a string after a certain number of words. @@ -2070,7 +2070,7 @@ Newlines within the string will be removed. .. templatefilter:: truncatewords_html truncatewords_html -~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^ Similar to ``truncatewords``, except that it is aware of HTML tags. Any tags that are opened in the string and not closed before the truncation point, are @@ -2091,7 +2091,7 @@ Newlines in the HTML content will be preserved. .. templatefilter:: unordered_list unordered_list -~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^ Recursively takes a self-nested list and returns an HTML unordered list -- WITHOUT opening and closing <ul> tags. @@ -2118,7 +2118,7 @@ Note: An older, more restrictive and verbose input format is also supported: .. templatefilter:: upper upper -~~~~~ +^^^^^ Converts a string into all uppercase. @@ -2131,7 +2131,7 @@ If ``value`` is ``"Joel is a slug"``, the output will be ``"JOEL IS A SLUG"``. .. templatefilter:: urlencode urlencode -~~~~~~~~~ +^^^^^^^^^ Escapes a value for use in a URL. @@ -2158,7 +2158,7 @@ If ``value`` is ``"http://www.example.org/"``, the output will be .. templatefilter:: urlize urlize -~~~~~~ +^^^^^^ Converts URLs in text into clickable links. @@ -2197,7 +2197,7 @@ Django's built-in :tfilter:`escape` filter. The default value for .. templatefilter:: urlizetrunc urlizetrunc -~~~~~~~~~~~ +^^^^^^^^^^^ Converts URLs into clickable links just like urlize_, but truncates URLs longer than the given character limit. @@ -2218,7 +2218,7 @@ As with urlize_, this filter should only be applied to plain text. .. templatefilter:: wordcount wordcount -~~~~~~~~~ +^^^^^^^^^ Returns the number of words. @@ -2231,7 +2231,7 @@ If ``value`` is ``"Joel is a slug"``, the output will be ``4``. .. templatefilter:: wordwrap wordwrap -~~~~~~~~ +^^^^^^^^ Wraps words at specified line length. @@ -2250,7 +2250,7 @@ If ``value`` is ``Joel is a slug``, the output would be:: .. templatefilter:: yesno yesno -~~~~~ +^^^^^ Given a string mapping values for true, false and (optionally) None, returns one of those strings according to the value: @@ -2277,13 +2277,13 @@ enable explicitly in your :setting:`INSTALLED_APPS` setting and enable in your template with the ``{% load %}`` tag. django.contrib.humanize -~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^ A set of Django template filters useful for adding a "human touch" to data. See :doc:`/ref/contrib/humanize`. django.contrib.markup -~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^ A collection of template filters that implement these common markup languages: @@ -2294,13 +2294,13 @@ A collection of template filters that implement these common markup languages: See the :doc:`markup documentation </ref/contrib/markup>`. django.contrib.webdesign -~~~~~~~~~~~~~~~~~~~~~~~~ +^^^^^^^^^^^^^^^^^^^^^^^^ A collection of template tags that can be useful while designing a Web site, such as a generator of Lorem Ipsum text. See :doc:`/ref/contrib/webdesign`. i18n -~~~~ +^^^^ Provides a couple of templatetags that allow specifying translatable text in Django templates. It is slightly different from the libraries described @@ -2311,7 +2311,7 @@ then loading it with ``{% load i18n %}``. See :ref:`specifying-translation-strings-in-template-code`. l10n -~~~~ +^^^^ Provides a couple of templatetags that allow control over the localization of values in Django templates. It is slightly different from the libraries described @@ -2319,3 +2319,68 @@ above because you don't need to add any application to the :setting:`INSTALLED_A you only need to load the library using ``{% load l10n %}``. See :ref:`topic-l10n-templates`. + +static +^^^^^^ + +.. templatetag:: static + +static +"""""" + +.. highlight:: html+django + +To link to static files Django ships with a :ttag:`static` template tag. You +can use this regardless if you're using :class:`~django.template.RequestContext` +or not. + +.. code-block:: html+django + + {% load static %} + <img src="{% static "images/hi.jpg" %}" /> + +It is also able to consume standard context variables, e.g. assuming a +``user_stylesheet`` variable is passed to the template: + +.. code-block:: html+django + + {% load static %} + <link rel="stylesheet" href="{% static user_stylesheet %}" type="text/css" media="screen" /> + +.. templatetag:: get_static_prefix + +get_static_prefix +""""""""""""""""" + +.. highlight:: html+django + +If you're not using :class:`~django.template.RequestContext`, or if you need +more control over exactly where and how :setting:`STATIC_URL` is injected +into the template, you can use the :ttag:`get_static_prefix` template tag +instead:: + + {% load static %} + <img src="{% get_static_prefix %}images/hi.jpg" /> + +There's also a second form you can use to avoid extra processing if you need +the value multiple times:: + + {% load static %} + {% get_static_prefix as STATIC_PREFIX %} + + <img src="{{ STATIC_PREFIX }}images/hi.jpg" /> + <img src="{{ STATIC_PREFIX }}images/hi2.jpg" /> + +.. templatetag:: get_media_prefix + +get_media_prefix +"""""""""""""""" + +.. highlight:: html+django + +Similar to the :ttag:`get_static_prefix`, ``get_media_prefix`` populates a +template variable with the media prefix :setting:`MEDIA_URL`, e.g.:: + + <script type="text/javascript" charset="utf-8"> + var media_path = '{% get_media_prefix %}'; + </script> diff --git a/docs/releases/1.4.txt b/docs/releases/1.4.txt index c01ff092b8..20f1ba63cf 100644 --- a/docs/releases/1.4.txt +++ b/docs/releases/1.4.txt @@ -212,6 +212,42 @@ Django 1.4 also includes several smaller improvements worth noting: Backwards incompatible changes in 1.4 ===================================== +django.contrib.admin +~~~~~~~~~~~~~~~~~~~~ + +The included administration app ``django.contrib.admin`` has for a long time +shipped with a default set of static files such as JavaScript, images and +stylesheets. Django 1.3 added a new contrib app ``django.contrib.staticfiles`` +to handle such files in a generic way and defined conventions for static +files included in apps. + +Starting in Django 1.4 the admin's static files are now also following this +convention to make it easier to deploy the included files. In previous +versions of Django, it was also common to define a ``ADMIN_MEDIA_PREFIX`` +setting to point to the URL where the admin's static files are served by a +web server. This setting has now been deprecated and replaced by the more +general setting :setting:`STATIC_URL`. Django will now expect to find the +admin static files under the URL ``<STATIC_URL>/admin/``. + +If you've previously used a URL path for ``ADMIN_MEDIA_PREFIX`` (e.g. +``/media/``) simply make sure :setting:`STATIC_URL` and :setting:`STATIC_ROOT` +are configured and your web server serves the files correctly. The development +server continues to serve the admin files just like before. Don't hesitate to +consult the :doc:`static files howto </howto/static-files>` for further +details. + +In case your ``ADMIN_MEDIA_PREFIX`` is set to an own domain (e.g. +``http://media.example.com/admin/``) make sure to also set your +:setting:`STATIC_URL` setting to the correct URL, for example +``http://media.example.com/``. + +.. warning:: + + If you're implicitely relying on the path of the admin static files on + your server's file system when you deploy your site, you have to update + that path. The files were moved from :file:`django/contrib/admin/media/` + to :file:`django/contrib/admin/static/admin/`. + Compatibility with old signed data ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/tests/regressiontests/admin_util/tests.py b/tests/regressiontests/admin_util/tests.py index ef34a5b026..683a2d4e9c 100644 --- a/tests/regressiontests/admin_util/tests.py +++ b/tests/regressiontests/admin_util/tests.py @@ -133,7 +133,7 @@ class UtilTests(unittest.TestCase): # Regression test for #13071: NullBooleanField has special # handling. display_value = display_for_field(None, models.NullBooleanField()) - expected = u'<img src="%simg/admin/icon-unknown.gif" alt="None" />' % settings.ADMIN_MEDIA_PREFIX + expected = u'<img src="%sadmin/img/icon-unknown.gif" alt="None" />' % settings.STATIC_URL self.assertEqual(display_value, expected) display_value = display_for_field(None, models.DecimalField()) diff --git a/tests/regressiontests/admin_widgets/tests.py b/tests/regressiontests/admin_widgets/tests.py index 8f7a36c951..3cdb017372 100644 --- a/tests/regressiontests/admin_widgets/tests.py +++ b/tests/regressiontests/admin_widgets/tests.py @@ -21,6 +21,9 @@ from django.utils.unittest import TestCase import models +admin_media_prefix = lambda: { + 'ADMIN_MEDIA_PREFIX': "%sadmin/" % settings.STATIC_URL, +} class AdminFormfieldForDBFieldTests(TestCase): """ @@ -189,19 +192,19 @@ class AdminForeignKeyRawIdWidget(DjangoTestCase): self.assertEqual(lookup1, lookup2) -class FilteredSelectMultipleWidgetTest(TestCase): +class FilteredSelectMultipleWidgetTest(DjangoTestCase): def test_render(self): w = FilteredSelectMultiple('test', False) self.assertEqual( conditional_escape(w.render('test', 'test')), - '<select multiple="multiple" name="test" class="selectfilter">\n</select><script type="text/javascript">addEvent(window, "load", function(e) {SelectFilter.init("id_test", "test", 0, "%(ADMIN_MEDIA_PREFIX)s"); });</script>\n' % {"ADMIN_MEDIA_PREFIX": settings.ADMIN_MEDIA_PREFIX} + '<select multiple="multiple" name="test" class="selectfilter">\n</select><script type="text/javascript">addEvent(window, "load", function(e) {SelectFilter.init("id_test", "test", 0, "%(ADMIN_MEDIA_PREFIX)s"); });</script>\n' % admin_media_prefix() ) def test_stacked_render(self): w = FilteredSelectMultiple('test', True) self.assertEqual( conditional_escape(w.render('test', 'test')), - '<select multiple="multiple" name="test" class="selectfilterstacked">\n</select><script type="text/javascript">addEvent(window, "load", function(e) {SelectFilter.init("id_test", "test", 1, "%(ADMIN_MEDIA_PREFIX)s"); });</script>\n' % {"ADMIN_MEDIA_PREFIX": settings.ADMIN_MEDIA_PREFIX} + '<select multiple="multiple" name="test" class="selectfilterstacked">\n</select><script type="text/javascript">addEvent(window, "load", function(e) {SelectFilter.init("id_test", "test", 1, "%(ADMIN_MEDIA_PREFIX)s"); });</script>\n' % admin_media_prefix() ) @@ -255,7 +258,7 @@ class ForeignKeyRawIdWidgetTest(DjangoTestCase): w = ForeignKeyRawIdWidget(rel) self.assertEqual( conditional_escape(w.render('test', band.pk, attrs={})), - '<input type="text" name="test" value="%(bandpk)s" class="vForeignKeyRawIdAdminField" /><a href="../../../admin_widgets/band/?t=id" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_MEDIA_PREFIX)simg/admin/selector-search.gif" width="16" height="16" alt="Lookup" /></a> <strong>Linkin Park</strong>' % {"ADMIN_MEDIA_PREFIX": settings.ADMIN_MEDIA_PREFIX, "bandpk": band.pk}, + '<input type="text" name="test" value="%(bandpk)s" class="vForeignKeyRawIdAdminField" /><a href="../../../admin_widgets/band/?t=id" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_MEDIA_PREFIX)simg/selector-search.gif" width="16" height="16" alt="Lookup" /></a> <strong>Linkin Park</strong>' % dict(admin_media_prefix(), bandpk=band.pk), ) def test_relations_to_non_primary_key(self): @@ -270,7 +273,7 @@ class ForeignKeyRawIdWidgetTest(DjangoTestCase): w = ForeignKeyRawIdWidget(rel) self.assertEqual( w.render('test', core.parent_id, attrs={}), - '<input type="text" name="test" value="86" class="vForeignKeyRawIdAdminField" /><a href="../../../admin_widgets/inventory/?t=barcode" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_MEDIA_PREFIX)simg/admin/selector-search.gif" width="16" height="16" alt="Lookup" /></a> <strong>Apple</strong>' % {"ADMIN_MEDIA_PREFIX": settings.ADMIN_MEDIA_PREFIX}, + '<input type="text" name="test" value="86" class="vForeignKeyRawIdAdminField" /><a href="../../../admin_widgets/inventory/?t=barcode" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_MEDIA_PREFIX)simg/selector-search.gif" width="16" height="16" alt="Lookup" /></a> <strong>Apple</strong>' % admin_media_prefix(), ) @@ -287,7 +290,7 @@ class ForeignKeyRawIdWidgetTest(DjangoTestCase): ) self.assertEqual( w.render('test', child_of_hidden.parent_id, attrs={}), - '<input type="text" name="test" value="93" class="vForeignKeyRawIdAdminField" /><a href="../../../admin_widgets/inventory/?t=barcode" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_MEDIA_PREFIX)simg/admin/selector-search.gif" width="16" height="16" alt="Lookup" /></a> <strong>Hidden</strong>' % {"ADMIN_MEDIA_PREFIX": settings.ADMIN_MEDIA_PREFIX}, + '<input type="text" name="test" value="93" class="vForeignKeyRawIdAdminField" /><a href="../../../admin_widgets/inventory/?t=barcode" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_MEDIA_PREFIX)simg/selector-search.gif" width="16" height="16" alt="Lookup" /></a> <strong>Hidden</strong>' % admin_media_prefix(), ) @@ -306,12 +309,12 @@ class ManyToManyRawIdWidgetTest(DjangoTestCase): w = ManyToManyRawIdWidget(rel) self.assertEqual( conditional_escape(w.render('test', [m1.pk, m2.pk], attrs={})), - '<input type="text" name="test" value="%(m1pk)s,%(m2pk)s" class="vManyToManyRawIdAdminField" /><a href="../../../admin_widgets/member/" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_MEDIA_PREFIX)simg/admin/selector-search.gif" width="16" height="16" alt="Lookup" /></a>' % {"ADMIN_MEDIA_PREFIX": settings.ADMIN_MEDIA_PREFIX, "m1pk": m1.pk, "m2pk": m2.pk}, + '<input type="text" name="test" value="%(m1pk)s,%(m2pk)s" class="vManyToManyRawIdAdminField" /><a href="../../../admin_widgets/member/" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_MEDIA_PREFIX)simg/selector-search.gif" width="16" height="16" alt="Lookup" /></a>' % dict(admin_media_prefix(), m1pk=m1.pk, m2pk=m2.pk), ) self.assertEqual( conditional_escape(w.render('test', [m1.pk])), - '<input type="text" name="test" value="%(m1pk)s" class="vManyToManyRawIdAdminField" /><a href="../../../admin_widgets/member/" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_MEDIA_PREFIX)simg/admin/selector-search.gif" width="16" height="16" alt="Lookup" /></a>' % {"ADMIN_MEDIA_PREFIX": settings.ADMIN_MEDIA_PREFIX, "m1pk": m1.pk}, + '<input type="text" name="test" value="%(m1pk)s" class="vManyToManyRawIdAdminField" /><a href="../../../admin_widgets/member/" class="related-lookup" id="lookup_id_test" onclick="return showRelatedObjectLookupPopup(this);"> <img src="%(ADMIN_MEDIA_PREFIX)simg/selector-search.gif" width="16" height="16" alt="Lookup" /></a>' % dict(admin_media_prefix(), m1pk=m1.pk, m2pk=m2.pk), ) self.assertEqual(w._has_changed(None, None), False) diff --git a/tests/regressiontests/forms/tests/media.py b/tests/regressiontests/forms/tests/media.py index fd30029741..bed5a816bf 100644 --- a/tests/regressiontests/forms/tests/media.py +++ b/tests/regressiontests/forms/tests/media.py @@ -1,19 +1,13 @@ # -*- coding: utf-8 -*- from django.conf import settings from django.forms import TextInput, Media, TextInput, CharField, Form, MultiWidget -from django.utils.unittest import TestCase +from django.test import TestCase +from django.test.utils import override_settings +from django.template import Template, Context class FormsMediaTestCase(TestCase): - # Tests for the media handling on widgets and forms - def setUp(self): - super(FormsMediaTestCase, self).setUp() - self.original_media_url = settings.MEDIA_URL - settings.MEDIA_URL = 'http://media.example.com/media/' - - def tearDown(self): - settings.MEDIA_URL = self.original_media_url - super(FormsMediaTestCase, self).tearDown() + """Tests for the media handling on widgets and forms""" def test_construction(self): # Check construction of media objects @@ -449,7 +443,6 @@ class FormsMediaTestCase(TestCase): <script type="text/javascript" src="/some/form/javascript"></script>""") # Media works in templates - from django.template import Template, Context self.assertEqual(Template("{{ form.media.js }}{{ form.media.css }}").render(Context({'form': f3})), """<script type="text/javascript" src="/path/to/js1"></script> <script type="text/javascript" src="http://media.other.com/path/to/js2"></script> <script type="text/javascript" src="https://secure.other.com/path/to/js3"></script> @@ -459,20 +452,14 @@ class FormsMediaTestCase(TestCase): <link href="/path/to/css3" type="text/css" media="all" rel="stylesheet" /> <link href="/some/form/css" type="text/css" media="all" rel="stylesheet" />""") +FormsMediaTestCase = override_settings( + STATIC_URL=None, + MEDIA_URL='http://media.example.com/media/', +)(FormsMediaTestCase) -class StaticFormsMediaTestCase(TestCase): - # Tests for the media handling on widgets and forms - def setUp(self): - super(StaticFormsMediaTestCase, self).setUp() - self.original_media_url = settings.MEDIA_URL - self.original_static_url = settings.STATIC_URL - settings.MEDIA_URL = 'http://media.example.com/static/' - settings.STATIC_URL = 'http://media.example.com/static/' - def tearDown(self): - settings.MEDIA_URL = self.original_media_url - settings.STATIC_URL = self.original_static_url - super(StaticFormsMediaTestCase, self).tearDown() +class StaticFormsMediaTestCase(TestCase): + """Tests for the media handling on widgets and forms""" def test_construction(self): # Check construction of media objects @@ -908,7 +895,6 @@ class StaticFormsMediaTestCase(TestCase): <script type="text/javascript" src="/some/form/javascript"></script>""") # Media works in templates - from django.template import Template, Context self.assertEqual(Template("{{ form.media.js }}{{ form.media.css }}").render(Context({'form': f3})), """<script type="text/javascript" src="/path/to/js1"></script> <script type="text/javascript" src="http://media.other.com/path/to/js2"></script> <script type="text/javascript" src="https://secure.other.com/path/to/js3"></script> @@ -918,3 +904,8 @@ class StaticFormsMediaTestCase(TestCase): <link href="/path/to/css3" type="text/css" media="all" rel="stylesheet" /> <link href="/some/form/css" type="text/css" media="all" rel="stylesheet" />""") + +StaticFormsMediaTestCase = override_settings( + STATIC_URL='http://media.example.com/static/', + MEDIA_URL='http://media.example.com/media/', +)(StaticFormsMediaTestCase) diff --git a/tests/regressiontests/servers/tests.py b/tests/regressiontests/servers/tests.py index 29f169ccbd..b9d24ba571 100644 --- a/tests/regressiontests/servers/tests.py +++ b/tests/regressiontests/servers/tests.py @@ -1,32 +1,33 @@ """ Tests for django.core.servers. """ - import os +from urlparse import urljoin import django +from django.conf import settings from django.test import TestCase from django.core.handlers.wsgi import WSGIHandler from django.core.servers.basehttp import AdminMediaHandler -from django.conf import settings class AdminMediaHandlerTests(TestCase): def setUp(self): + self.admin_media_url = urljoin(settings.STATIC_URL, 'admin/') self.admin_media_file_path = os.path.abspath( - os.path.join(django.__path__[0], 'contrib', 'admin', 'media') + os.path.join(django.__path__[0], 'contrib', 'admin', 'static', 'admin') ) self.handler = AdminMediaHandler(WSGIHandler()) def test_media_urls(self): """ Tests that URLs that look like absolute file paths after the - settings.ADMIN_MEDIA_PREFIX don't turn into absolute file paths. + settings.STATIC_URL don't turn into absolute file paths. """ # Cases that should work on all platforms. data = ( - ('%scss/base.css' % settings.ADMIN_MEDIA_PREFIX, ('css', 'base.css')), + ('%scss/base.css' % self.admin_media_url, ('css', 'base.css')), ) # Cases that should raise an exception. bad_data = () @@ -35,19 +36,19 @@ class AdminMediaHandlerTests(TestCase): if os.sep == '/': data += ( # URL, tuple of relative path parts. - ('%s\\css/base.css' % settings.ADMIN_MEDIA_PREFIX, ('\\css', 'base.css')), + ('%s\\css/base.css' % self.admin_media_url, ('\\css', 'base.css')), ) bad_data += ( - '%s/css/base.css' % settings.ADMIN_MEDIA_PREFIX, - '%s///css/base.css' % settings.ADMIN_MEDIA_PREFIX, - '%s../css/base.css' % settings.ADMIN_MEDIA_PREFIX, + '%s/css/base.css' % self.admin_media_url, + '%s///css/base.css' % self.admin_media_url, + '%s../css/base.css' % self.admin_media_url, ) elif os.sep == '\\': bad_data += ( - '%sC:\css/base.css' % settings.ADMIN_MEDIA_PREFIX, - '%s/\\css/base.css' % settings.ADMIN_MEDIA_PREFIX, - '%s\\css/base.css' % settings.ADMIN_MEDIA_PREFIX, - '%s\\\\css/base.css' % settings.ADMIN_MEDIA_PREFIX + '%sC:\css/base.css' % self.admin_media_url, + '%s/\\css/base.css' % self.admin_media_url, + '%s\\css/base.css' % self.admin_media_url, + '%s\\\\css/base.css' % self.admin_media_url ) for url, path_tuple in data: try: diff --git a/tests/regressiontests/staticfiles_tests/project/site_media/static/test/storage.txt b/tests/regressiontests/staticfiles_tests/project/site_media/static/test/storage.txt deleted file mode 100644 index 2eda9ce727..0000000000 --- a/tests/regressiontests/staticfiles_tests/project/site_media/static/test/storage.txt +++ /dev/null @@ -1 +0,0 @@ -Yeah!
\ No newline at end of file diff --git a/tests/regressiontests/staticfiles_tests/tests.py b/tests/regressiontests/staticfiles_tests/tests.py index 1e2b549281..4c0c53b2d2 100644 --- a/tests/regressiontests/staticfiles_tests/tests.py +++ b/tests/regressiontests/staticfiles_tests/tests.py @@ -8,15 +8,16 @@ import tempfile from StringIO import StringIO from django.conf import settings -from django.contrib.staticfiles import finders, storage from django.core.exceptions import ImproperlyConfigured from django.core.files.storage import default_storage from django.core.management import call_command from django.test import TestCase +from django.test.utils import override_settings from django.utils.encoding import smart_unicode from django.utils.functional import empty from django.utils._os import rmtree_errorhandler +from django.contrib.staticfiles import finders, storage TEST_ROOT = os.path.dirname(__file__) @@ -26,31 +27,6 @@ class StaticFilesTestCase(TestCase): Test case with a couple utility assertions. """ def setUp(self): - self.old_static_url = settings.STATIC_URL - self.old_static_root = settings.STATIC_ROOT - self.old_staticfiles_dirs = settings.STATICFILES_DIRS - self.old_staticfiles_finders = settings.STATICFILES_FINDERS - self.old_media_root = settings.MEDIA_ROOT - self.old_media_url = settings.MEDIA_URL - self.old_admin_media_prefix = settings.ADMIN_MEDIA_PREFIX - self.old_debug = settings.DEBUG - - site_media = os.path.join(TEST_ROOT, 'project', 'site_media') - settings.DEBUG = True - settings.MEDIA_ROOT = os.path.join(site_media, 'media') - settings.MEDIA_URL = '/media/' - settings.STATIC_ROOT = os.path.join(site_media, 'static') - settings.STATIC_URL = '/static/' - settings.ADMIN_MEDIA_PREFIX = '/static/admin/' - settings.STATICFILES_DIRS = ( - os.path.join(TEST_ROOT, 'project', 'documents'), - ) - settings.STATICFILES_FINDERS = ( - 'django.contrib.staticfiles.finders.FileSystemFinder', - 'django.contrib.staticfiles.finders.AppDirectoriesFinder', - 'django.contrib.staticfiles.finders.DefaultStorageFinder', - ) - # Clear the cached default_storage out, this is because when it first # gets accessed (by some other test), it evaluates settings.MEDIA_ROOT, # since we're planning on changing that we need to clear out the cache. @@ -58,25 +34,14 @@ class StaticFilesTestCase(TestCase): # To make sure SVN doesn't hangs itself with the non-ASCII characters # during checkout, we actually create one file dynamically. - self._nonascii_filepath = os.path.join( + _nonascii_filepath = os.path.join( TEST_ROOT, 'apps', 'test', 'static', 'test', u'fi\u015fier.txt') - f = codecs.open(self._nonascii_filepath, 'w', 'utf-8') + f = codecs.open(_nonascii_filepath, 'w', 'utf-8') try: f.write(u"fi\u015fier in the app dir") finally: f.close() - - def tearDown(self): - settings.DEBUG = self.old_debug - settings.MEDIA_ROOT = self.old_media_root - settings.MEDIA_URL = self.old_media_url - settings.ADMIN_MEDIA_PREFIX = self.old_admin_media_prefix - settings.STATIC_ROOT = self.old_static_root - settings.STATIC_URL = self.old_static_url - settings.STATICFILES_DIRS = self.old_staticfiles_dirs - settings.STATICFILES_FINDERS = self.old_staticfiles_finders - if os.path.exists(self._nonascii_filepath): - os.unlink(self._nonascii_filepath) + self.addCleanup(os.unlink, _nonascii_filepath) def assertFileContains(self, filepath, text): self.assertTrue(text in self._get_file(smart_unicode(filepath)), @@ -85,6 +50,20 @@ class StaticFilesTestCase(TestCase): def assertFileNotFound(self, filepath): self.assertRaises(IOError, self._get_file, filepath) +StaticFilesTestCase = override_settings( + DEBUG = True, + MEDIA_URL = '/media/', + STATIC_URL = '/static/', + MEDIA_ROOT = os.path.join(TEST_ROOT, 'project', 'site_media', 'media'), + STATIC_ROOT = os.path.join(TEST_ROOT, 'project', 'site_media', 'static'), + STATICFILES_DIRS = (os.path.join(TEST_ROOT, 'project', 'documents'),), + STATICFILES_FINDERS = ( + 'django.contrib.staticfiles.finders.FileSystemFinder', + 'django.contrib.staticfiles.finders.AppDirectoriesFinder', + 'django.contrib.staticfiles.finders.DefaultStorageFinder', + ), +)(StaticFilesTestCase) + class BuildStaticTestCase(StaticFilesTestCase): """ @@ -100,11 +79,11 @@ class BuildStaticTestCase(StaticFilesTestCase): self.old_root = settings.STATIC_ROOT settings.STATIC_ROOT = tempfile.mkdtemp() self.run_collectstatic() + # Use our own error handler that can handle .svn dirs on Windows + self.addCleanup(shutil.rmtree, settings.STATIC_ROOT, + ignore_errors=True, onerror=rmtree_errorhandler) def tearDown(self): - # Use our own error handler that can handle .svn dirs on Windows - shutil.rmtree(settings.STATIC_ROOT, ignore_errors=True, - onerror=rmtree_errorhandler) settings.STATIC_ROOT = self.old_root super(BuildStaticTestCase, self).tearDown() @@ -122,6 +101,7 @@ class BuildStaticTestCase(StaticFilesTestCase): f.close() + class TestDefaults(object): """ A few standard test cases. @@ -258,14 +238,11 @@ class TestBuildStaticNonLocalStorage(BuildStaticTestCase, TestNoFilesCreated): """ Tests for #15035 """ - def setUp(self): - self.old_staticfiles_storage = settings.STATICFILES_STORAGE - settings.STATICFILES_STORAGE = 'regressiontests.staticfiles_tests.storage.DummyStorage' - super(TestBuildStaticNonLocalStorage, self).setUp() + pass - def tearDown(self): - super(TestBuildStaticNonLocalStorage, self).tearDown() - settings.STATICFILES_STORAGE = self.old_staticfiles_storage +TestBuildStaticNonLocalStorage = override_settings( + STATICFILES_STORAGE='regressiontests.staticfiles_tests.storage.DummyStorage', +)(TestBuildStaticNonLocalStorage) if sys.platform != 'win32': @@ -336,7 +313,7 @@ class TestServeAdminMedia(TestServeStatic): """ def _response(self, filepath): return self.client.get( - posixpath.join(settings.ADMIN_MEDIA_PREFIX, filepath)) + posixpath.join(settings.STATIC_URL, 'admin/', filepath)) def test_serve_admin_media(self): self.assertFileContains('css/base.css', 'body') @@ -423,12 +400,9 @@ class TestStaticfilesDirsType(TestCase): We can't determine if STATICFILES_DIRS is set correctly just by looking at the type, but we can determine if it's definitely wrong. """ - def setUp(self): - self.old_settings_dir = settings.STATICFILES_DIRS - settings.STATICFILES_DIRS = 'a string' - - def tearDown(self): - settings.STATICFILES_DIRS = self.old_settings_dir - def test_non_tuple_raises_exception(self): self.assertRaises(ImproperlyConfigured, finders.FileSystemFinder) + +TestStaticfilesDirsType = override_settings( + STATICFILES_DIRS = 'a string', +)(TestStaticfilesDirsType) diff --git a/tests/regressiontests/templates/tests.py b/tests/regressiontests/templates/tests.py index 36a1ca3fe0..8ea462e378 100644 --- a/tests/regressiontests/templates/tests.py +++ b/tests/regressiontests/templates/tests.py @@ -12,6 +12,7 @@ import os import sys import traceback import warnings +from urlparse import urljoin from django import template from django.template import base as template_base @@ -1608,6 +1609,8 @@ class Templates(unittest.TestCase): 'static-prefixtag02': ('{% load static %}{% get_static_prefix as static_prefix %}{{ static_prefix }}', {}, settings.STATIC_URL), 'static-prefixtag03': ('{% load static %}{% get_media_prefix %}', {}, settings.MEDIA_URL), 'static-prefixtag04': ('{% load static %}{% get_media_prefix as media_prefix %}{{ media_prefix }}', {}, settings.MEDIA_URL), + 'static-statictag01': ('{% load static %}{% static "admin/base.css" %}', {}, urljoin(settings.STATIC_URL, 'admin/base.css')), + 'static-statictag02': ('{% load static %}{% static base_css %}', {'base_css': 'admin/base.css'}, urljoin(settings.STATIC_URL, 'admin/base.css')), } class TemplateTagLoading(unittest.TestCase): diff --git a/tests/runtests.py b/tests/runtests.py index 31bb074e67..f3733093de 100755 --- a/tests/runtests.py +++ b/tests/runtests.py @@ -106,11 +106,13 @@ def setup(verbosity, test_labels): 'LOGIN_URL': settings.LOGIN_URL, 'LANGUAGE_CODE': settings.LANGUAGE_CODE, 'MIDDLEWARE_CLASSES': settings.MIDDLEWARE_CLASSES, + 'STATIC_URL': settings.STATIC_URL, } # Redirect some settings for the duration of these tests. settings.INSTALLED_APPS = ALWAYS_INSTALLED_APPS settings.ROOT_URLCONF = 'urls' + settings.STATIC_URL = '/static/' settings.TEMPLATE_DIRS = (os.path.join(os.path.dirname(__file__), TEST_TEMPLATE_DIR),) settings.USE_I18N = True settings.LANGUAGE_CODE = 'en' |
