summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Graham <timograham@gmail.com>2016-12-19 11:05:48 -0500
committerTim Graham <timograham@gmail.com>2016-12-19 16:18:06 -0500
commite233f357bd463df519ca5cd01106f1f59fb5733d (patch)
treeec407a3474c4987e0ddd84809c9085235c2c3fa5
parentcc0bb07013ed3e7ec58ee6da014ed3094a1a350f (diff)
Refs #25484 -- Removed incorrect unquoting in {% static %}.
Regression in 374e6230ca9f9bb84cc9dd760dfb6395fbb5ff0f. Thanks Florian Apolloner for the report and analysis.
-rw-r--r--django/templatetags/static.py4
-rw-r--r--tests/staticfiles_tests/storage.py5
-rw-r--r--tests/staticfiles_tests/test_templatetags.py15
3 files changed, 20 insertions, 4 deletions
diff --git a/django/templatetags/static.py b/django/templatetags/static.py
index 41e6c581ba..0f46fa33da 100644
--- a/django/templatetags/static.py
+++ b/django/templatetags/static.py
@@ -2,7 +2,7 @@ from django import template
from django.apps import apps
from django.utils.encoding import iri_to_uri
from django.utils.html import conditional_escape
-from django.utils.six.moves.urllib.parse import unquote, urljoin
+from django.utils.six.moves.urllib.parse import urljoin
register = template.Library()
@@ -102,7 +102,7 @@ class StaticNode(template.Node):
return self.handle_simple(path)
def render(self, context):
- url = unquote(self.url(context))
+ url = self.url(context)
if context.autoescape:
url = conditional_escape(url)
if self.varname is None:
diff --git a/tests/staticfiles_tests/storage.py b/tests/staticfiles_tests/storage.py
index cf648f06f2..467217ae53 100644
--- a/tests/staticfiles_tests/storage.py
+++ b/tests/staticfiles_tests/storage.py
@@ -58,6 +58,11 @@ class PathNotImplementedStorage(storage.Storage):
raise NotImplementedError
+class QueryStringStorage(storage.Storage):
+ def url(self, path):
+ return path + '?a=b&c=d'
+
+
class SimpleCachedStaticFilesStorage(CachedStaticFilesStorage):
def file_hash(self, name, content=None):
diff --git a/tests/staticfiles_tests/test_templatetags.py b/tests/staticfiles_tests/test_templatetags.py
index 050f19b179..541b233855 100644
--- a/tests/staticfiles_tests/test_templatetags.py
+++ b/tests/staticfiles_tests/test_templatetags.py
@@ -1,5 +1,7 @@
from __future__ import unicode_literals
+from django.test import override_settings
+
from .cases import StaticFilesTestCase
@@ -8,5 +10,14 @@ class TestTemplateTag(StaticFilesTestCase):
def test_template_tag(self):
self.assertStaticRenders("does/not/exist.png", "/static/does/not/exist.png")
self.assertStaticRenders("testfile.txt", "/static/testfile.txt")
- self.assertStaticRenders("test.html?foo=1&bar=2", "/static/test.html?foo=1&bar=2", autoescape=False)
- self.assertStaticRenders("test.html?foo=1&bar=2", "/static/test.html?foo=1&amp;bar=2", autoescape=True)
+ self.assertStaticRenders("special?chars&quoted.html", "/static/special%3Fchars%26quoted.html")
+
+ @override_settings(STATICFILES_STORAGE='staticfiles_tests.storage.QueryStringStorage')
+ def test_template_tag_escapes(self):
+ """
+ Storage.url() should return an encoded path and might be overridden
+ to also include a querystring. {% static %} escapes the URL to avoid
+ raw '&', for example.
+ """
+ self.assertStaticRenders('a.html', 'a.html?a=b&amp;c=d')
+ self.assertStaticRenders('a.html', 'a.html?a=b&c=d', autoescape=False)