Ticket #14693: 14693.2.diff
File 14693.2.diff, 49.1 KB (added by , 14 years ago) |
---|
-
django/conf/global_settings.py
diff --git a/django/conf/global_settings.py b/django/conf/global_settings.py index fab2d0f..73e81b2 100644
a b TEMPLATE_CONTEXT_PROCESSORS = ( 195 195 'django.core.context_processors.debug', 196 196 'django.core.context_processors.i18n', 197 197 'django.core.context_processors.media', 198 'django.core.context_processors.static', 198 199 # 'django.core.context_processors.request', 199 200 'django.contrib.messages.context_processors.messages', 200 'django.contrib.staticfiles.context_processors.staticfiles',201 201 ) 202 202 203 203 # Output to use in template system for invalid (e.g. misspelled) variables. … … MEDIA_ROOT = '' 263 263 # Example: "http://media.lawrence.com" 264 264 MEDIA_URL = '' 265 265 266 # Absolute path to the directory that holds static files. 267 # Example: "/home/media/media.lawrence.com/static/" 268 STATIC_ROOT = '' 269 270 # URL that handles the static files served from STATIC_ROOT. 271 # Example: "http://media.lawrence.com/static/" 272 STATIC_URL = '' 273 266 274 # List of upload handler classes to be applied in order. 267 275 FILE_UPLOAD_HANDLERS = ( 268 276 'django.core.files.uploadhandler.MemoryFileUploadHandler', … … FIXTURE_DIRS = () 552 560 # STATICFILES # 553 561 ############### 554 562 555 # Absolute path to the directory that holds media.556 # Example: "/home/media/media.lawrence.com/static/"557 STATICFILES_ROOT = ''558 559 # URL that handles the static files served from STATICFILES_ROOT.560 # Example: "http://media.lawrence.com/static/"561 STATICFILES_URL = '/static/'562 563 563 # A list of locations of additional static files 564 564 STATICFILES_DIRS = () 565 565 -
django/conf/project_template/settings.py
diff --git a/django/conf/project_template/settings.py b/django/conf/project_template/settings.py index 07a823b..19d5ccd 100644
a b MEDIA_URL = '' 54 54 55 55 # Absolute path to the directory that holds media. 56 56 # Example: "/home/media/media.lawrence.com/static/" 57 STATIC FILES_ROOT = ''57 STATIC_ROOT = '' 58 58 59 # URL that handles the static files served from STATIC FILES_ROOT.59 # URL that handles the static files served from STATIC_ROOT. 60 60 # Example: "http://static.lawrence.com/", "http://example.com/static/" 61 STATIC FILES_URL = '/static/'61 STATIC_URL = '/static/' 62 62 63 63 # URL prefix for admin media -- CSS, JavaScript and images. 64 64 # Make sure to use a trailing slash. -
django/contrib/admin/templatetags/adminmedia.py
diff --git a/django/contrib/admin/templatetags/adminmedia.py b/django/contrib/admin/templatetags/adminmedia.py index 5429810..0671efc 100644
a b 1 1 from django.template import Library 2 from django. utils.encoding import iri_to_uri2 from django.templatetags.static import PrefixNode 3 3 4 4 register = Library() 5 5 6 @register.simple_tag 6 7 def admin_media_prefix(): 7 8 """ 8 9 Returns the string contained in the setting ADMIN_MEDIA_PREFIX. 9 10 """ 10 try: 11 from django.conf import settings 12 except ImportError: 13 return '' 14 return iri_to_uri(settings.ADMIN_MEDIA_PREFIX) 15 admin_media_prefix = register.simple_tag(admin_media_prefix) 11 return PrefixNode.get_prefix("ADMIN_MEDIA_PREFIX") -
deleted file django/contrib/staticfiles/context_processors.py
diff --git a/django/contrib/staticfiles/context_processors.py b/django/contrib/staticfiles/context_processors.py deleted file mode 100644 index 3ed0071..0000000
+ - 1 from django.conf import settings2 3 def staticfiles(request):4 return {5 'STATICFILES_URL': settings.STATICFILES_URL,6 } -
django/contrib/staticfiles/handlers.py
diff --git a/django/contrib/staticfiles/handlers.py b/django/contrib/staticfiles/handlers.py index 20b0496..54a52d3 100644
a b from django.contrib.staticfiles.views import serve 10 10 class StaticFilesHandler(WSGIHandler): 11 11 """ 12 12 WSGI middleware that intercepts calls to the static files directory, as 13 defined by the STATIC FILES_URL setting, and serves those files.13 defined by the STATIC_URL setting, and serves those files. 14 14 """ 15 def __init__(self, application, media_dir=None):15 def __init__(self, application, base_dir=None): 16 16 self.application = application 17 if media_dir:18 self. media_dir = media_dir17 if base_dir: 18 self.base_dir = base_dir 19 19 else: 20 self. media_dir = self.get_media_dir()21 self. media_url = urlparse(self.get_media_url())20 self.base_dir = self.get_base_dir() 21 self.base_url = urlparse(self.get_base_url()) 22 22 if settings.DEBUG: 23 23 utils.check_settings() 24 24 super(StaticFilesHandler, self).__init__() 25 25 26 def get_ media_dir(self):27 return settings.STATIC FILES_ROOT26 def get_base_dir(self): 27 return settings.STATIC_ROOT 28 28 29 def get_ media_url(self):30 return settings.STATIC FILES_URL29 def get_base_url(self): 30 return settings.STATIC_URL 31 31 32 32 def _should_handle(self, path): 33 33 """ 34 34 Checks if the path should be handled. Ignores the path if: 35 35 36 * the host is provided as part of the media_url36 * the host is provided as part of the base_url 37 37 * the request's path isn't under the media path (or equal) 38 38 * settings.DEBUG isn't True 39 39 """ 40 return (self. media_url[2] != path and41 path.startswith(self. media_url[2]) and not self.media_url[1])40 return (self.base_url[2] != path and 41 path.startswith(self.base_url[2]) and not self.base_url[1]) 42 42 43 43 def file_path(self, url): 44 44 """ 45 45 Returns the relative path to the media file on disk for the given URL. 46 46 47 The passed URL is assumed to begin with `` media_url``. If the47 The passed URL is assumed to begin with ``base_url``. If the 48 48 resultant file path is outside the media directory, then a ValueError 49 49 is raised. 50 50 """ 51 # Remove ``media_url``. 52 relative_url = url[len(self.media_url[2]):] 51 relative_url = url[len(self.base_url[2]):] 53 52 return urllib.url2pathname(relative_url) 54 53 55 54 def serve(self, request): -
django/contrib/staticfiles/management/commands/collectstatic.py
diff --git a/django/contrib/staticfiles/management/commands/collectstatic.py b/django/contrib/staticfiles/management/commands/collectstatic.py index d121223..8882ae2 100644
a b from django.contrib.staticfiles import finders 12 12 class Command(NoArgsCommand): 13 13 """ 14 14 Command that allows to copy or symlink media files from different 15 locations to the settings.STATIC FILES_ROOT.15 locations to the settings.STATIC_ROOT. 16 16 """ 17 17 option_list = NoArgsCommand.option_list + ( 18 18 make_option('--noinput', action='store_false', dest='interactive', … … Type 'yes' to continue, or 'no' to cancel: """) 85 85 self.stdout.write("\n%s static file%s %s to '%s'%s.\n" 86 86 % (actual_count, actual_count != 1 and 's' or '', 87 87 symlink and 'symlinked' or 'copied', 88 settings.STATIC FILES_ROOT,88 settings.STATIC_ROOT, 89 89 unmodified_count and ' (%s unmodified)' 90 90 % unmodified_count or '')) 91 91 -
django/contrib/staticfiles/management/commands/runserver.py
diff --git a/django/contrib/staticfiles/management/commands/runserver.py b/django/contrib/staticfiles/management/commands/runserver.py index e138759..f4c2259 100644
a b from django.contrib.staticfiles.handlers import StaticFilesHandler 8 8 class Command(BaseRunserverCommand): 9 9 option_list = BaseRunserverCommand.option_list + ( 10 10 make_option('--nostatic', action="store_false", dest='use_static_handler', default=True, 11 help='Tells Django to NOT automatically serve static files at STATIC FILES_URL.'),11 help='Tells Django to NOT automatically serve static files at STATIC_URL.'), 12 12 make_option('--insecure', action="store_true", dest='insecure_serving', default=False, 13 13 help='Allows serving static files even if DEBUG is False.'), 14 14 ) -
django/contrib/staticfiles/storage.py
diff --git a/django/contrib/staticfiles/storage.py b/django/contrib/staticfiles/storage.py index b4bfea7..db55895 100644
a b class StaticFilesStorage(FileSystemStorage): 12 12 Standard file system storage for site media files. 13 13 14 14 The defaults for ``location`` and ``base_url`` are 15 ``STATIC FILES_ROOT`` and ``STATICFILES_URL``.15 ``STATIC_ROOT`` and ``STATIC_URL``. 16 16 """ 17 17 def __init__(self, location=None, base_url=None, *args, **kwargs): 18 18 if location is None: 19 location = settings.STATIC FILES_ROOT19 location = settings.STATIC_ROOT 20 20 if base_url is None: 21 base_url = settings.STATIC FILES_URL21 base_url = settings.STATIC_URL 22 22 if not location: 23 23 raise ImproperlyConfigured("You're using the staticfiles app " 24 "without having set the STATIC FILES_ROOT setting. Set it to "24 "without having set the STATIC_ROOT setting. Set it to " 25 25 "the absolute path of the directory that holds static media.") 26 26 if not base_url: 27 27 raise ImproperlyConfigured("You're using the staticfiles app " 28 "without having set the STATIC FILES_URL setting. Set it to "29 "URL that handles the files served from STATIC FILES_ROOT.")28 "without having set the STATIC_URL setting. Set it to " 29 "URL that handles the files served from STATIC_ROOT.") 30 30 if settings.DEBUG: 31 31 utils.check_settings() 32 32 super(StaticFilesStorage, self).__init__(location, base_url, *args, **kwargs) -
deleted file django/contrib/staticfiles/templatetags/staticfiles.py
diff --git a/django/contrib/staticfiles/templatetags/__init__.py b/django/contrib/staticfiles/templatetags/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/django/contrib/staticfiles/templatetags/staticfiles.py b/django/contrib/staticfiles/templatetags/staticfiles.py deleted file mode 100644 index 6153f5a..0000000
+ - 1 from django import template2 from django.utils.encoding import iri_to_uri3 4 register = template.Library()5 6 class StaticFilesPrefixNode(template.Node):7 8 def __init__(self, varname=None):9 self.varname = varname10 11 def render(self, context):12 try:13 from django.conf import settings14 except ImportError:15 prefix = ''16 else:17 prefix = iri_to_uri(settings.STATICFILES_URL)18 if self.varname is None:19 return prefix20 context[self.varname] = prefix21 return ''22 23 @register.tag24 def get_staticfiles_prefix(parser, token):25 """26 Populates a template variable with the prefix (settings.STATICFILES_URL).27 28 Usage::29 30 {% get_staticfiles_prefix [as varname] %}31 32 Examples::33 34 {% get_staticfiles_prefix %}35 {% get_staticfiles_prefix as staticfiles_prefix %}36 37 """38 tokens = token.contents.split()39 if len(tokens) > 1 and tokens[1] != 'as':40 raise template.TemplateSyntaxError(41 "First argument in '%s' must be 'as'" % tokens[0])42 return StaticFilesPrefixNode(varname=(len(tokens) > 1 and tokens[2] or None))43 -
django/contrib/staticfiles/urls.py
diff --git a/django/contrib/staticfiles/urls.py b/django/contrib/staticfiles/urls.py index 70f04f2..aa4ab45 100644
a b def staticfiles_urlpatterns(prefix=None): 18 18 if not settings.DEBUG: 19 19 return [] 20 20 if prefix is None: 21 prefix = settings.STATIC FILES_URL22 if not prefix :21 prefix = settings.STATIC_URL 22 if not prefix or '://' in prefix: 23 23 raise ImproperlyConfigured( 24 "The prefix for the 'staticfiles_urlpatterns' helper is empty. " 25 "Make sure the STATICFILES_URL setting is set correctly.") 26 if '://' in prefix: 27 raise ImproperlyConfigured( 28 "The STATICFILES_URL setting is a full URL, not a path and " 29 "can't be used with the 'staticfiles_urlpatterns' helper.") 24 "The prefix for the 'staticfiles_urlpatterns' helper is invalid.") 30 25 if prefix.startswith("/"): 31 26 prefix = prefix[1:] 32 27 return patterns('', -
django/contrib/staticfiles/utils.py
diff --git a/django/contrib/staticfiles/utils.py b/django/contrib/staticfiles/utils.py index 0071dbd..d307253 100644
a b def get_files(storage, ignore_patterns=[], location=''): 33 33 34 34 def check_settings(): 35 35 """ 36 Checks if the MEDIA_(ROOT|URL) and STATIC FILES_(ROOT|URL)36 Checks if the MEDIA_(ROOT|URL) and STATIC_(ROOT|URL) 37 37 settings have the same value. 38 38 """ 39 if settings.MEDIA_URL == settings.STATIC FILES_URL:40 raise ImproperlyConfigured("The MEDIA_URL and STATIC FILES_URL "39 if settings.MEDIA_URL == settings.STATIC_URL: 40 raise ImproperlyConfigured("The MEDIA_URL and STATIC_URL " 41 41 "settings must have individual values") 42 if ((settings.MEDIA_ROOT and settings.STATIC FILES_ROOT) and43 (settings.MEDIA_ROOT == settings.STATIC FILES_ROOT)):44 raise ImproperlyConfigured("The MEDIA_ROOT and STATIC FILES_ROOT "42 if ((settings.MEDIA_ROOT and settings.STATIC_ROOT) and 43 (settings.MEDIA_ROOT == settings.STATIC_ROOT)): 44 raise ImproperlyConfigured("The MEDIA_ROOT and STATIC_ROOT " 45 45 "settings must have individual values") -
django/core/context_processors.py
diff --git a/django/core/context_processors.py b/django/core/context_processors.py index 7a59728..fa05d42 100644
a b def i18n(request): 66 66 67 67 return context_extras 68 68 69 def static(request): 70 """ 71 Adds static-related context variables to the context. 72 73 """ 74 return {'STATIC_URL': settings.STATIC_URL} 75 69 76 def media(request): 70 77 """ 71 78 Adds media-related context variables to the context. -
django/core/servers/basehttp.py
diff --git a/django/core/servers/basehttp.py b/django/core/servers/basehttp.py index 9c92a88..7667558 100644
a b class AdminMediaHandler(StaticFilesHandler): 643 643 security and is not super efficient. 644 644 """ 645 645 646 def get_ media_dir(self):646 def get_base_dir(self): 647 647 import django 648 648 return os.path.join(django.__path__[0], 'contrib', 'admin', 'media') 649 649 650 def get_ media_url(self):650 def get_base_url(self): 651 651 from django.conf import settings 652 652 return settings.ADMIN_MEDIA_PREFIX 653 653 … … class AdminMediaHandler(StaticFilesHandler): 660 660 is raised. 661 661 """ 662 662 # Remove ``media_url``. 663 relative_url = url[len(self. media_url[2]):]663 relative_url = url[len(self.base_url[2]):] 664 664 relative_path = urllib.url2pathname(relative_url) 665 return safe_join(self. media_dir, relative_path)665 return safe_join(self.base_dir, relative_path) 666 666 667 667 def serve(self, request): 668 668 document_root, path = os.path.split(self.file_path(request.path)) … … class AdminMediaHandler(StaticFilesHandler): 673 673 """ 674 674 Checks if the path should be handled. Ignores the path if: 675 675 676 * the host is provided as part of the media_url677 * the request's path isn't under the mediapath676 * the host is provided as part of the base_url 677 * the request's path isn't under the base path 678 678 """ 679 return path.startswith(self. media_url[2]) and not self.media_url[1]679 return path.startswith(self.base_url[2]) and not self.base_url[1] 680 680 681 681 682 682 def run(addr, port, wsgi_handler): -
django/forms/widgets.py
diff --git a/django/forms/widgets.py b/django/forms/widgets.py index cb12586..86559e9 100644
a b 1 1 """ 2 2 HTML Widget classes 3 3 """ 4 import datetime 5 from itertools import chain 6 import time 7 from urlparse import urljoin 8 from util import flatatt 4 9 5 10 import django.utils.copycompat as copy 6 from itertools import chain7 11 from django.conf import settings 8 12 from django.utils.datastructures import MultiValueDict, MergeDict 9 13 from django.utils.html import escape, conditional_escape … … from django.utils.translation import ugettext, ugettext_lazy 11 15 from django.utils.encoding import StrAndUnicode, force_unicode 12 16 from django.utils.safestring import mark_safe 13 17 from django.utils import datetime_safe, formats 14 import time15 import datetime16 from util import flatatt17 from urlparse import urljoin18 18 19 19 __all__ = ( 20 20 'Media', 'MediaDefiningClass', 'Widget', 'TextInput', 'PasswordInput', … … class Media(StrAndUnicode): 63 63 for path in self._css[medium]] 64 64 for medium in media]) 65 65 66 def absolute_path(self, path ):66 def absolute_path(self, path, prefix=None): 67 67 if path.startswith(u'http://') or path.startswith(u'https://') or path.startswith(u'/'): 68 68 return path 69 return urljoin(settings.MEDIA_URL,path) 69 if prefix is None: 70 if settings.STATIC_URL: 71 prefix = settings.STATIC_URL 72 else: 73 # backwards compatibility 74 prefix = settings.MEDIA_URL 75 return urljoin(prefix, path) 70 76 71 77 def __getitem__(self, name): 72 78 "Returns a Media object that only contains media of the given type" -
new file django/templatetags/static.py
diff --git a/django/templatetags/static.py b/django/templatetags/static.py new file mode 100644 index 0000000..0213318
- + 1 from django import template 2 from django.utils.encoding import iri_to_uri 3 4 register = template.Library() 5 6 class PrefixNode(template.Node): 7 8 def __repr__(self): 9 return "<PrefixNode for %r>" % self.name 10 11 def __init__(self, varname=None, name=None): 12 if name is None: 13 raise template.TemplateSyntaxError( 14 "Prefix nodes must be given a name to return.") 15 self.varname = varname 16 self.name = name 17 18 @classmethod 19 def handle_token(cls, parser, token, name): 20 """ 21 Class method to parse prefix node and return a Node. 22 """ 23 tokens = token.contents.split() 24 if len(tokens) > 1 and tokens[1] != 'as': 25 raise template.TemplateSyntaxError( 26 "First argument in '%s' must be 'as'" % tokens[0]) 27 if len(tokens) > 1: 28 varname = tokens[2] 29 else: 30 varname = None 31 return cls(varname, name) 32 33 @classmethod 34 def get_prefix(cls, name): 35 try: 36 from django.conf import settings 37 except ImportError: 38 prefix = '' 39 else: 40 prefix = iri_to_uri(getattr(settings, name, '')) 41 return prefix 42 43 def render(self, context): 44 prefix = self.get_prefix(self.name) 45 if self.varname is None: 46 return prefix 47 context[self.varname] = prefix 48 return '' 49 50 @register.tag 51 def get_static_prefix(parser, token): 52 """ 53 Populates a template variable with the static prefix, 54 ``settings.STATIC_URL``. 55 56 Usage:: 57 58 {% get_static_prefix [as varname] %} 59 60 Examples:: 61 62 {% get_static_prefix %} 63 {% get_static_prefix as static_prefix %} 64 65 """ 66 return PrefixNode.handle_token(parser, token, "STATIC_URL") 67 68 @register.tag 69 def get_media_prefix(parser, token): 70 """ 71 Populates a template variable with the static prefix, 72 ``settings.MEDIA_URL``. 73 74 Usage:: 75 76 {% get_media_prefix [as varname] %} 77 78 Examples:: 79 80 {% get_media_prefix %} 81 {% get_media_prefix as media_prefix %} 82 83 """ 84 return PrefixNode.handle_token(parser, token, "MEDIA_URL") -
docs/howto/static-files.txt
diff --git a/docs/howto/static-files.txt b/docs/howto/static-files.txt index 37f1fc3..e27cb99 100644
a b Here's the basic usage in a nutshell: 50 50 First, you'll need to make sure that ``django.contrib.staticfiles`` is in 51 51 your :setting:`INSTALLED_APPS`. 52 52 53 Next, you'll need to edit :setting:`STATIC FILES_ROOT` to point to where53 Next, you'll need to edit :setting:`STATIC_ROOT` to point to where 54 54 you'd like your static media stored. For example:: 55 55 56 STATIC FILES_ROOT = "/home/jacob/projects/mysite.com/static_media"56 STATIC_ROOT = "/home/jacob/projects/mysite.com/static_media" 57 57 58 You may also want to set the :setting:`STATIC FILES_URL` setting at this58 You may also want to set the :setting:`STATIC_URL` setting at this 59 59 time, though the default value (of ``/static/``) is perfect for local 60 60 development. 61 61 … … Here's the basic usage in a nutshell: 69 69 ./manage.py collectstatic 70 70 71 71 This'll churn through your static file storage and move them into the 72 directory given by :setting:`STATIC FILES_ROOT`. (This is not necessary72 directory given by :setting:`STATIC_ROOT`. (This is not necessary 73 73 in local development if you are using :djadmin:`runserver` or adding 74 74 ``staticfiles_urlpatterns`` to your URLconf; see below). 75 75 … … Here's the basic usage in a nutshell: 78 78 If you're using the built-in development server (the 79 79 :djadmin:`runserver` management command) and have the :setting:`DEBUG` 80 80 setting set to ``True``, your staticfiles will automatically be served 81 from :setting:`STATIC FILES_URL` in development.81 from :setting:`STATIC_URL` in development. 82 82 83 83 If you are using some other server for local development, you can 84 84 quickly serve static media locally by adding:: … … Here's the basic usage in a nutshell: 98 98 99 99 .. code-block:: html+django 100 100 101 <img src="{{ STATIC FILES_URL }}images/hi.jpg />101 <img src="{{ STATIC_URL }}images/hi.jpg /> 102 102 103 103 See :ref:`staticfiles-in-templates` for more details, including an 104 104 alternate method (using a template tag). … … the framework see :doc:`the staticfiles reference </ref/contrib/staticfiles>`. 115 115 app is to make it easier to keep static files separate from user-uploaded 116 116 files. For this reason, you will probably want to make your 117 117 :setting:`MEDIA_ROOT` and :setting:`MEDIA_URL` different from your 118 :setting:`STATIC FILES_ROOT` and :setting:`STATICFILES_URL`. You will need to118 :setting:`STATIC_ROOT` and :setting:`STATIC_URL`. You will need to 119 119 arrange for serving of files in :setting:`MEDIA_ROOT` yourself; 120 120 ``staticfiles`` does not deal with user-uploaded media at all. 121 121 … … development, and it makes it *very* hard to change where you've deployed your 136 136 media. If, for example, you wanted to switch to using a content delivery network 137 137 (CDN), then you'd need to change more or less every single template. 138 138 139 A far better way is to use the value of the :setting:`STATIC FILES_URL` setting139 A far better way is to use the value of the :setting:`STATIC_URL` setting 140 140 directly in your templates. This means that a switch of media servers only 141 141 requires changing that single value. Much better! 142 142 … … With a context processor 147 147 ------------------------ 148 148 149 149 The included context processor is the easy way. Simply make sure 150 ``'django.co ntrib.staticfiles.context_processors.staticfiles'`` is in your150 ``'django.core.context_processors.static'`` is in your 151 151 :setting:`TEMPLATE_CONTEXT_PROCESSORS`. It's there by default, and if you're 152 152 editing that setting by hand it should look something like:: 153 153 … … editing that setting by hand it should look something like:: 155 155 'django.core.context_processors.debug', 156 156 'django.core.context_processors.i18n', 157 157 'django.core.context_processors.media', 158 'django.core.context_processors.static', 158 159 'django.contrib.auth.context_processors.auth', 159 160 'django.contrib.messages.context_processors.messages', 160 'django.contrib.staticfiles.context_processors.staticfiles',161 161 ) 162 162 163 Once that's done, you can refer to :setting:`STATIC FILES_URL` in your templates:163 Once that's done, you can refer to :setting:`STATIC_URL` in your templates: 164 164 165 165 .. code-block:: html+django 166 166 167 <img src="{{ STATIC FILES_URL }}images/hi.jpg />167 <img src="{{ STATIC_URL }}images/hi.jpg /> 168 168 169 If ``{{ STATIC FILES_URL }}`` isn't working in your template, you're probably not169 If ``{{ STATIC_URL }}`` isn't working in your template, you're probably not 170 170 using :class:`~django.template.RequestContext` when rendering the template. 171 171 172 172 As a brief refresher, context processors add variables into the contexts of … … To see how that works, and to read more details, check out 180 180 With a template tag 181 181 ------------------- 182 182 183 The second option is the :ttag:`get_static files_prefix` template tag. You can183 The second option is the :ttag:`get_static_prefix` template tag. You can 184 184 use this if you're not using :class:`~django.template.RequestContext`, or if you 185 need more control over exactly where and how :setting:`STATIC FILES_URL` is185 need more control over exactly where and how :setting:`STATIC_URL` is 186 186 injected into the template. Here's an example: 187 187 188 188 .. code-block:: html+django 189 189 190 {% load static files%}191 <img src="{% get_static files_prefix %}images/hi.jpg" />190 {% load static %} 191 <img src="{% get_static_prefix %}images/hi.jpg" /> 192 192 193 193 There's also a second form you can use to avoid extra processing if you need the 194 194 value multiple times: 195 195 196 196 .. code-block:: html+django 197 197 198 {% load static files%}199 {% get_static files_prefix as STATIC_PREFIX %}198 {% load static %} 199 {% get_static_prefix as STATIC_PREFIX %} 200 200 201 201 <img src="{{ STATIC_PREFIX }}images/hi.jpg" /> 202 202 <img src="{{ STATIC_PREFIX }}images/hi2.jpg" /> … … Thus, the ``staticfiles`` app ships with a quick and dirty helper view that you 213 213 can use to serve files locally in development. 214 214 215 215 This view is automatically enabled and will serve your static files at 216 :setting:`STATIC FILES_URL` when you use the built-in :djadmin:`runserver`.216 :setting:`STATIC_URL` when you use the built-in :djadmin:`runserver`. 217 217 218 218 To enable this view if you are using some other server for local development, 219 219 you'll add a couple of lines to your URLconf. The first line goes at the top of … … the file, and the last line at the bottom:: 225 225 226 226 urlpatterns += staticfiles_urlpatterns() 227 227 228 This will inspect your :setting:`STATIC FILES_URL` and229 :setting:`STATIC FILES_ROOT` settings and wire up the view to serve static media228 This will inspect your :setting:`STATIC_URL` and 229 :setting:`STATIC_ROOT` settings and wire up the view to serve static media 230 230 accordingly. Don't forget to set the :setting:`STATICFILES_DIRS` setting 231 231 appropriately to let ``django.contrib.staticfiles`` know where to look for 232 files.232 (additional) files. 233 233 234 234 .. warning:: 235 235 … … files. 239 239 **insecure**. This is only intended for local development, and should 240 240 **never be used in production**. 241 241 242 Additionally, your :setting:`STATIC_URL` setting can't be either empty 243 or a full URL such as ``http://static.example.com/``. 244 242 245 For a few more details, including an alternate method of enabling this view, 243 246 see :ref:`staticfiles-development-view`. 244 247 … … Serving static files in production 249 252 250 253 The basic outline of putting static files into production is simple: run the 251 254 :djadmin:`collectstatic` command when static media changes, then arrange for the 252 collected media directory (:setting:`STATIC FILES_ROOT`) to be moved to the media255 collected media directory (:setting:`STATIC_ROOT`) to be moved to the media 253 256 server and served. 254 257 255 258 Of course, as with all deployment tasks, the devil's in the details. Every … … app, the basic outline gets modified to look something like: 264 267 265 268 * Push your code up to the deployment server. 266 269 * On the server, run :djadmin:`collectstatic` to move all the media into 267 :setting:`STATIC FILES_ROOT`.268 * Point your web server at :setting:`STATIC FILES_ROOT`. For example, here's270 :setting:`STATIC_ROOT`. 271 * Point your web server at :setting:`STATIC_ROOT`. For example, here's 269 272 :ref:`how to do this under Apache and mod_wsgi <serving-media-files>`. 270 273 271 274 You'll probably want to automate this process, especially if you've got multiple … … Since your media server won't be running Django, you'll need to modify the 322 325 deployment strategy to look something like: 323 326 324 327 * When your media changes, run :djadmin:`collectstatic` locally. 325 * Push your local :setting:`STATIC FILES_ROOT` up to the media server328 * Push your local :setting:`STATIC_ROOT` up to the media server 326 329 into the directory that's being served. ``rsync`` is a good 327 330 choice for this step since it only needs to transfer the 328 331 bits of static media that have changed. … … you'll need to make a few changes: 403 406 * The management commands ``build_static`` and ``resolve_static`` are now 404 407 called :djadmin:`collectstatic` and :djadmin:`findstatic`. 405 408 406 * The settings ``STATIC_URL`` and ``STATIC_ROOT`` were renamed to407 :setting:`STATICFILES_URL` and :setting:`STATICFILES_ROOT`.408 409 409 * The settings ``STATICFILES_PREPEND_LABEL_APPS``, 410 410 ``STATICFILES_MEDIA_DIRNAMES`` and ``STATICFILES_EXCLUDED_APPS`` were 411 411 removed. -
docs/man/django-admin.1
diff --git a/docs/man/django-admin.1 b/docs/man/django-admin.1 index 2197af6..f9b530a 100644
a b Do not prompt the user for input. 165 165 Disable the development server's auto\-reloader. 166 166 .TP 167 167 .I \-\-nostatic 168 Disable automatic serving of static files from STATIC FILES_URL.168 Disable automatic serving of static files from STATIC_URL. 169 169 .TP 170 170 .I \-\-insecure 171 171 Enables serving of static files even if DEBUG is False. -
docs/ref/contrib/staticfiles.txt
diff --git a/docs/ref/contrib/staticfiles.txt b/docs/ref/contrib/staticfiles.txt index f82fd79..df31323 100644
a b Settings 23 23 24 24 .. highlight:: python 25 25 26 The following settings control the behavior of the staticfiles app. Only 27 :setting:`STATICFILES_ROOT` is required, but you'll probably also need to 28 configure :setting:`STATICFILES_URL` as well. 29 30 .. setting:: STATICFILES_ROOT 31 32 STATICFILES_ROOT 33 ---------------- 34 35 Default: ``''`` (Empty string) 36 37 The absolute path to the directory that the :djadmin:`collectstatic` management 38 command will collect static files into, for serving from 39 :setting:`STATICFILES_URL`:: 40 41 STATICFILES_ROOT = "/home/example.com/static/" 42 43 This is a **required setting** unless you've overridden 44 :setting:`STATICFILES_STORAGE` and are using a custom storage backend. 45 46 This is not a place to store your static files permanently under version 47 control; you should do that in directories that will be found by your 48 :setting:`STATICFILES_FINDERS` (by default, per-app ``static/`` subdirectories, 49 and any directories you include in :setting:`STATICFILES_DIRS`). Files from 50 those locations will be collected into :setting:`STATICFILES_ROOT`. 51 52 .. setting:: STATICFILES_URL 53 54 STATICFILES_URL 55 --------------- 56 57 Default: ``'/static/'`` 58 59 The URL that handles the files served from :setting:`STATICFILES_ROOT`, e.g.:: 60 61 STATICFILES_URL = '/site_media/static/' 62 63 ... or perhaps:: 64 65 STATICFILES_URL = 'http://static.example.com/' 26 .. note:: 66 27 67 This should **always** have a trailing slash. 28 The following settings control the behavior of the staticfiles app. 29 Configuring the global settings :setting:`STATIC_ROOT` and 30 :setting:`STATIC_URL` is **required**. 68 31 69 32 .. setting:: STATICFILES_DIRS 70 33 … … tuples, e.g.:: 98 61 99 62 With this configuration, the :djadmin:`collectstatic` management command would 100 63 for example collect the stats files in a ``'downloads'`` directory. So 101 assuming you have :setting:`STATIC FILES_URL` set ``'/static/'``, this would64 assuming you have :setting:`STATIC_URL` set ``'/static/'``, this would 102 65 allow you to refer to the file ``'/opt/webfiles/stats/polls_20101022.tar.gz'`` 103 66 with ``'/static/downloads/polls_20101022.tar.gz'`` in your templates. 104 67 … … collectstatic 160 123 161 124 .. django-admin:: collectstatic 162 125 163 Collects the static files into :setting:`STATIC FILES_ROOT`.126 Collects the static files into :setting:`STATIC_ROOT`. 164 127 165 128 Duplicate file names are by default resolved in a similar way to how template 166 129 resolution works: the file that is first found in one of the specified … … collected for a given path. 223 186 Other Helpers 224 187 ============= 225 188 226 The ``static files`` context processor227 -------------------------------- -----189 The ``static`` context processor 190 -------------------------------- 228 191 229 .. function:: django.co ntrib.staticfiles.context_processors.staticfiles192 .. function:: django.core.context_processors.static 230 193 231 This context processor adds the :setting:`STATIC FILES_URL` into each template232 context as the variable ``{{ STATIC FILES_URL }}``. To use it, make sure that233 ``'django.co ntrib.staticfiles.context_processors.staticfiles'`` appears234 somewhere in your:setting:`TEMPLATE_CONTEXT_PROCESSORS` setting.194 This context processor adds the :setting:`STATIC_URL` into each template 195 context as the variable ``{{ STATIC_URL }}``. To use it, make sure that 196 ``'django.core.context_processors.static'`` appears somewhere in your 197 :setting:`TEMPLATE_CONTEXT_PROCESSORS` setting. 235 198 236 199 Remember, only templates rendered with :class:`~django.template.RequestContext` 237 200 will have acces to the data provided by this (and any) context processor. 238 201 239 .. templatetag:: get_static files_prefix202 .. templatetag:: get_static_prefix 240 203 241 The ``get_static files_prefix`` templatetag242 ===================================== =====204 The ``get_static_prefix`` templatetag 205 ===================================== 243 206 244 207 .. highlight:: html+django 245 208 246 209 If you're not using :class:`~django.template.RequestContext`, or if you need 247 more control over exactly where and how :setting:`STATIC FILES_URL` is injected248 into the template, you can use the :ttag:`get_static files_prefix` template tag210 more control over exactly where and how :setting:`STATIC_URL` is injected 211 into the template, you can use the :ttag:`get_static_prefix` template tag 249 212 instead:: 250 213 251 {% load static files%}252 <img src="{% get_static files_prefix %}images/hi.jpg" />214 {% load static %} 215 <img src="{% get_static_prefix %}images/hi.jpg" /> 253 216 254 217 There's also a second form you can use to avoid extra processing if you need 255 218 the value multiple times:: 256 219 257 {% load static files%}258 {% get_static files_prefix as STATIC_PREFIX %}220 {% load static %} 221 {% get_static_prefix as STATIC_PREFIX %} 259 222 260 223 <img src="{{ STATIC_PREFIX }}images/hi.jpg" /> 261 224 <img src="{{ STATIC_PREFIX }}images/hi2.jpg" /> … … primary URL configuration:: 292 255 ) 293 256 294 257 Note, the begin of the pattern (``r'^static/'``) should be your 295 :setting:`STATIC FILES_URL` setting.258 :setting:`STATIC_URL` setting. 296 259 297 260 Since this is a bit finicky, there's also a helper function that'll do this for you: 298 261 … … already defined pattern list. Use it like this:: 307 270 308 271 urlpatterns += staticfiles_urlpatterns() 309 272 273 .. warning:: 274 275 This helper function will only work if :setting:`DEBUG` is ``True`` 276 and your :setting:`STATIC_URL` setting is neither empty nor a full 277 URL such as ``http://static.example.com/``. -
docs/ref/settings.txt
diff --git a/docs/ref/settings.txt b/docs/ref/settings.txt index b394cd7..1632e0a 100644
a b administrative interface. Make sure to use a trailing slash, and to have this be 56 56 different from the :setting:``MEDIA_URL`` setting (since the same URL cannot be 57 57 mapped onto two different sets of files). For integration with :doc:`staticfiles 58 58 </ref/contrib/staticfiles>`, this should be the same as 59 :setting:`STATIC FILES_URL` followed by ``'admin/'``.59 :setting:`STATIC_URL` followed by ``'admin/'``. 60 60 61 61 .. setting:: ADMINS 62 62 … … Default: ``''`` (Empty string) 1122 1122 URL that handles the media served from :setting:`MEDIA_ROOT`, used 1123 1123 for :doc:`managing stored files </topics/files>`. 1124 1124 1125 Example: ``"http://media.lawrence.com "``1125 Example: ``"http://media.lawrence.com/"`` 1126 1126 1127 1127 Note that this should have a trailing slash if it has a path component. 1128 1128 1129 * Good: ``"http://www.example.com/ static/"``1130 * Bad: ``"http://www.example.com/ static"``1129 * Good: ``"http://www.example.com/media/"`` 1130 * Bad: ``"http://www.example.com/media"`` 1131 1131 1132 1132 MESSAGE_LEVEL 1133 1133 ------------- … … See :doc:`/ref/contrib/sites`. 1486 1486 1487 1487 .. _site framework docs: ../sites/ 1488 1488 1489 .. setting:: STATIC_ROOT 1490 1491 STATIC_ROOT 1492 ----------- 1493 1494 Default: ``''`` (Empty string) 1495 1496 The absolute path to the directory that contains static content. 1497 1498 Example: ``"/home/example.com/static/"`` 1499 1500 When using the :djadmin:`collectstatic` management command of the optional, 1501 :doc:`staticfiles</ref/contrib/staticfiles>` app this will be used to collect 1502 static files into and served from :setting:`STATIC_URL`. 1503 1504 In that case this is a **required setting**, unless you've overridden 1505 :setting:`STATICFILES_STORAGE` and are using a custom storage backend. 1506 1507 This is not a place to store your static files permanently under version 1508 control; you should do that in directories that will be found by your 1509 :setting:`STATICFILES_FINDERS` (by default, per-app ``static/`` subdirectories, 1510 and any directories you include in :setting:`STATICFILES_DIRS`). Files from 1511 those locations will be collected into :setting:`STATIC_ROOT`. 1512 1513 See :doc:`/ref/contrib/staticfiles` and :setting:`STATIC_URL`. 1514 1515 .. setting:: STATIC_URL 1516 1517 STATIC_URL 1518 ---------- 1519 1520 Default: ``'/static/'`` 1521 1522 URL that handles the files served from :setting:`STATIC_ROOT`. 1523 1524 Example: ``"/site_media/static/"`` or ``"http://static.example.com/"`` 1525 1526 This is used in the :doc:`staticfiles app</ref/contrib/staticfiles>`. 1527 1528 See :setting:`STATIC_ROOT`. 1529 1489 1530 .. setting:: TEMPLATE_CONTEXT_PROCESSORS 1490 1531 1491 1532 TEMPLATE_CONTEXT_PROCESSORS … … Default:: 1496 1537 ("django.contrib.auth.context_processors.auth", 1497 1538 "django.core.context_processors.debug", 1498 1539 "django.core.context_processors.i18n", 1499 "django.contrib.staticfiles.context_processors.staticfiles", 1540 "django.core.context_processors.media", 1541 "django.core.context_processors.static", 1500 1542 "django.contrib.messages.context_processors.messages") 1501 1543 1502 1544 A tuple of callables that are used to populate the context in ``RequestContext``. … … of items to be merged into the context. 1513 1555 ``django.core.context_processors.auth`` to 1514 1556 ``django.contrib.auth.context_processors.auth``. 1515 1557 1558 .. versionadded:: 1.3 1559 The ``django.core.context_processors.static`` context processor 1560 was added in this release. 1561 1516 1562 .. setting:: TEMPLATE_DEBUG 1517 1563 1518 1564 TEMPLATE_DEBUG -
docs/ref/templates/api.txt
diff --git a/docs/ref/templates/api.txt b/docs/ref/templates/api.txt index aa4951e..e02debe 100644
a b and return a dictionary of items to be merged into the context. By default, 312 312 "django.core.context_processors.debug", 313 313 "django.core.context_processors.i18n", 314 314 "django.core.context_processors.media", 315 "django.co ntrib.messages.context_processors.messages",316 "django.contrib. staticfiles.context_processors.staticfiles")315 "django.core.context_processors.static", 316 "django.contrib.messages.context_processors.messages") 317 317 318 318 .. versionadded:: 1.2 319 319 In addition to these, ``RequestContext`` always uses … … If :setting:`TEMPLATE_CONTEXT_PROCESSORS` contains this processor, every 435 435 ``RequestContext`` will contain a variable ``MEDIA_URL``, providing the 436 436 value of the :setting:`MEDIA_URL` setting. 437 437 438 django.core.context_processors.static 439 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 440 441 .. versionadded:: 1.3 442 443 If :setting:`TEMPLATE_CONTEXT_PROCESSORS` contains this processor, every 444 ``RequestContext`` will contain a variable ``STATIC_URL``, providing the 445 value of the :setting:`STATIC_URL` setting. 446 438 447 django.core.context_processors.csrf 439 448 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 440 449 -
docs/releases/1.3.txt
diff --git a/docs/releases/1.3.txt b/docs/releases/1.3.txt index b5c0035..f795e77 100644
a b In previous versions of Django, it was common to place static assets in 59 59 app is to make it easier to keep static files separate from user-uploaded 60 60 files. For this reason, you will probably want to make your 61 61 :setting:`MEDIA_ROOT` and :setting:`MEDIA_URL` different from your 62 :setting:`STATIC FILES_ROOT` and :setting:`STATICFILES_URL`. You will need to62 :setting:`STATIC_ROOT` and :setting:`STATIC_URL`. You will need to 63 63 arrange for serving of files in :setting:`MEDIA_ROOT` yourself; 64 64 ``staticfiles`` does not deal with user-uploaded media at all. 65 65 -
tests/regressiontests/staticfiles_tests/tests.py
diff --git a/tests/regressiontests/staticfiles_tests/tests.py b/tests/regressiontests/staticfiles_tests/tests.py index 0a6c060..6cd581f 100644
a b class StaticFilesTestCase(TestCase): 23 23 Test case with a couple utility assertions. 24 24 """ 25 25 def setUp(self): 26 self.old_static files_url = settings.STATICFILES_URL27 self.old_static files_root = settings.STATICFILES_ROOT26 self.old_static_url = settings.STATIC_URL 27 self.old_static_root = settings.STATIC_ROOT 28 28 self.old_staticfiles_dirs = settings.STATICFILES_DIRS 29 29 self.old_staticfiles_finders = settings.STATICFILES_FINDERS 30 30 self.old_media_root = settings.MEDIA_ROOT … … class StaticFilesTestCase(TestCase): 40 40 settings.DEBUG = True 41 41 settings.MEDIA_ROOT = os.path.join(site_media, 'media') 42 42 settings.MEDIA_URL = '/media/' 43 settings.STATIC FILES_ROOT = os.path.join(site_media, 'static')44 settings.STATIC FILES_URL = '/static/'43 settings.STATIC_ROOT = os.path.join(site_media, 'static') 44 settings.STATIC_URL = '/static/' 45 45 settings.ADMIN_MEDIA_PREFIX = '/static/admin/' 46 46 settings.STATICFILES_DIRS = ( 47 47 os.path.join(TEST_ROOT, 'project', 'documents'), … … class StaticFilesTestCase(TestCase): 52 52 'django.contrib.staticfiles.finders.DefaultStorageFinder', 53 53 ) 54 54 settings.INSTALLED_APPS = [ 55 "django.contrib.staticfiles", 55 56 "regressiontests.staticfiles_tests", 56 57 ] 57 58 … … class StaticFilesTestCase(TestCase): 65 66 settings.MEDIA_ROOT = self.old_media_root 66 67 settings.MEDIA_URL = self.old_media_url 67 68 settings.ADMIN_MEDIA_PREFIX = self.old_admin_media_prefix 68 settings.STATIC FILES_ROOT = self.old_staticfiles_root69 settings.STATIC FILES_URL = self.old_staticfiles_url69 settings.STATIC_ROOT = self.old_static_root 70 settings.STATIC_URL = self.old_static_url 70 71 settings.STATICFILES_DIRS = self.old_staticfiles_dirs 71 72 settings.STATICFILES_FINDERS = self.old_staticfiles_finders 72 73 settings.INSTALLED_APPS = self.old_installed_apps … … class BuildStaticTestCase(StaticFilesTestCase): 91 92 def setUp(self): 92 93 super(BuildStaticTestCase, self).setUp() 93 94 self.old_staticfiles_storage = settings.STATICFILES_STORAGE 94 self.old_root = settings.STATIC FILES_ROOT95 settings.STATIC FILES_ROOT = tempfile.mkdtemp()95 self.old_root = settings.STATIC_ROOT 96 settings.STATIC_ROOT = tempfile.mkdtemp() 96 97 self.run_collectstatic() 97 98 98 99 def tearDown(self): 99 shutil.rmtree(settings.STATIC FILES_ROOT)100 settings.STATIC FILES_ROOT = self.old_root100 shutil.rmtree(settings.STATIC_ROOT) 101 settings.STATIC_ROOT = self.old_root 101 102 super(BuildStaticTestCase, self).tearDown() 102 103 103 104 def run_collectstatic(self, **kwargs): … … class BuildStaticTestCase(StaticFilesTestCase): 106 107 107 108 def _get_file(self, filepath): 108 109 assert filepath, 'filepath is empty.' 109 filepath = os.path.join(settings.STATIC FILES_ROOT, filepath)110 filepath = os.path.join(settings.STATIC_ROOT, filepath) 110 111 f = open(filepath) 111 112 try: 112 113 return f.read() … … class TestBuildStaticDryRun(BuildStaticTestCase): 231 232 """ 232 233 With --dry-run, no files created in destination dir. 233 234 """ 234 self.assertEquals(os.listdir(settings.STATIC FILES_ROOT), [])235 self.assertEquals(os.listdir(settings.STATIC_ROOT), []) 235 236 236 237 237 238 if sys.platform != 'win32': … … if sys.platform != 'win32': 251 252 With ``--link``, symbolic links are created. 252 253 253 254 """ 254 self.failUnless(os.path.islink(os.path.join(settings.STATIC FILES_ROOT, 'test.txt')))255 self.failUnless(os.path.islink(os.path.join(settings.STATIC_ROOT, 'test.txt'))) 255 256 256 257 257 258 class TestServeStatic(StaticFilesTestCase): … … class TestServeStatic(StaticFilesTestCase): 262 263 263 264 def _response(self, filepath): 264 265 return self.client.get( 265 posixpath.join(settings.STATIC FILES_URL, filepath))266 posixpath.join(settings.STATIC_URL, filepath)) 266 267 267 268 def assertFileContains(self, filepath, text): 268 269 self.assertContains(self._response(filepath), text) … … class TestMiscFinder(TestCase): 372 373 finders.get_finder, "django.contrib.staticfiles.finders.FooBarFinder") 373 374 self.assertRaises(ImproperlyConfigured, 374 375 finders.get_finder, "foo.bar.FooBarFinder") 375 376 377 class TemplateTagTest(TestCase):378 def test_get_staticfiles_prefix(self):379 """380 Test the get_staticfiles_prefix helper return the STATICFILES_URL setting.381 """382 self.assertEquals(Template(383 "{% load staticfiles %}"384 "{% get_staticfiles_prefix %}"385 ).render(Context()), settings.STATICFILES_URL)386 387 def test_get_staticfiles_prefix_with_as(self):388 """389 Test the get_staticfiles_prefix helper return the STATICFILES_URL setting.390 """391 self.assertEquals(Template(392 "{% load staticfiles %}"393 "{% get_staticfiles_prefix as staticfiles_prefix %}"394 "{{ staticfiles_prefix }}"395 ).render(Context()), settings.STATICFILES_URL) -
tests/regressiontests/templates/tests.py
diff --git a/tests/regressiontests/templates/tests.py b/tests/regressiontests/templates/tests.py index 29171eb..ea93beb 100644
a b class UTF8Class: 114 114 return u'ŠĐĆŽćžšđ'.encode('utf-8') 115 115 116 116 class Templates(unittest.TestCase): 117 def setUp(self): 118 self.old_static_url = settings.STATIC_URL 119 self.old_media_url = settings.MEDIA_URL 120 settings.STATIC_URL = u"/static/" 121 settings.MEDIA_URL = u"/media/" 122 123 def tearDown(self): 124 settings.STATIC_URL = self.old_static_url 125 settings.MEDIA_URL = self.old_media_url 126 117 127 def test_loaders_security(self): 118 128 ad_loader = app_directories.Loader() 119 129 fs_loader = filesystem.Loader() … … class Templates(unittest.TestCase): 1328 1338 'autoescape-filtertag01': ("{{ first }}{% filter safe %}{{ first }} x<y{% endfilter %}", {"first": "<a>"}, template.TemplateSyntaxError), 1329 1339 1330 1340 # ifqeual compares unescaped vales. 1331 'autoescape-ifequal01': ('{% ifequal var "this & that" %}yes{% endifequal %}', { "var": "this & that" }, "yes" 1341 'autoescape-ifequal01': ('{% ifequal var "this & that" %}yes{% endifequal %}', { "var": "this & that" }, "yes"), 1332 1342 1333 1343 # Arguments to filters are 'safe' and manipulate their input unescaped. 1334 1344 'autoescape-filters01': ('{{ var|cut:"&" }}', { "var": "this & that" }, "this that" ), 1335 'autoescape-filters02': ('{{ var|join:" & \" }}', { "var": ("Tom", "Dick", "Harry") }, "Tom & Dick & Harry" 1345 'autoescape-filters02': ('{{ var|join:" & \" }}', { "var": ("Tom", "Dick", "Harry") }, "Tom & Dick & Harry"), 1336 1346 1337 1347 # Literal strings are safe. 1338 'autoescape-literals01': ('{{ "this & that" }}',{}, "this & that" 1348 'autoescape-literals01': ('{{ "this & that" }}',{}, "this & that"), 1339 1349 1340 1350 # Iterating over strings outputs safe characters. 1341 'autoescape-stringiterations01': ('{% for l in var %}{{ l }},{% endfor %}', {'var': 'K&R'}, "K,&,R," 1351 'autoescape-stringiterations01': ('{% for l in var %}{{ l }},{% endfor %}', {'var': 'K&R'}, "K,&,R,"), 1342 1352 1343 1353 # Escape requirement survives lookup. 1344 'autoescape-lookup01': ('{{ var.key }}', { "var": {"key": "this & that" }}, "this & that" 1354 'autoescape-lookup01': ('{{ var.key }}', { "var": {"key": "this & that" }}, "this & that"), 1345 1355 1356 # Static template tags 1357 'static-prefixtag01': ('{% load static %}{% get_static_prefix %}', {}, settings.STATIC_URL), 1358 'static-prefixtag02': ('{% load static %}{% get_static_prefix as static_prefix %}{{ static_prefix }}', {}, settings.STATIC_URL), 1359 'static-prefixtag03': ('{% load static %}{% get_media_prefix %}', {}, settings.MEDIA_URL), 1360 'static-prefixtag04': ('{% load static %}{% get_media_prefix as media_prefix %}{{ media_prefix }}', {}, settings.MEDIA_URL), 1346 1361 } 1347 1362 1348 1349 1363 class TemplateTagLoading(unittest.TestCase): 1350 1364 1351 1365 def setUp(self):