mirror of
				https://github.com/django/django.git
				synced 2025-10-31 01:25:32 +00:00 
			
		
		
		
	Fixed #13765 - 'safe' parameter for urlencode filter
Thanks to KyleMac for the suggestion and SmileyChris for the patch git-svn-id: http://code.djangoproject.com/svn/django/trunk@13849 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
		| @@ -291,10 +291,20 @@ def upper(value): | |||||||
| upper.is_safe = False | upper.is_safe = False | ||||||
| upper = stringfilter(upper) | upper = stringfilter(upper) | ||||||
|  |  | ||||||
| def urlencode(value): | def urlencode(value, safe=None): | ||||||
|     """Escapes a value for use in a URL.""" |     """ | ||||||
|  |     Escapes a value for use in a URL. | ||||||
|  |  | ||||||
|  |     Takes an optional ``safe`` parameter used to determine the characters which | ||||||
|  |     should not be escaped by Django's ``urlquote`` method. If not provided, the | ||||||
|  |     default safe characters will be used (but an empty string can be provided | ||||||
|  |     when *all* characters should be escaped). | ||||||
|  |     """ | ||||||
|     from django.utils.http import urlquote |     from django.utils.http import urlquote | ||||||
|     return urlquote(value) |     kwargs = {} | ||||||
|  |     if safe is not None: | ||||||
|  |         kwargs['safe'] = safe | ||||||
|  |     return urlquote(value, **kwargs) | ||||||
| urlencode.is_safe = False | urlencode.is_safe = False | ||||||
| urlencode = stringfilter(urlencode) | urlencode = stringfilter(urlencode) | ||||||
|  |  | ||||||
|   | |||||||
| @@ -14,7 +14,7 @@ def urlquote(url, safe='/'): | |||||||
|     can safely be used as part of an argument to a subsequent iri_to_uri() call |     can safely be used as part of an argument to a subsequent iri_to_uri() call | ||||||
|     without double-quoting occurring. |     without double-quoting occurring. | ||||||
|     """ |     """ | ||||||
|     return force_unicode(urllib.quote(smart_str(url), safe)) |     return force_unicode(urllib.quote(smart_str(url), smart_str(safe))) | ||||||
|  |  | ||||||
| urlquote = allow_lazy(urlquote, unicode) | urlquote = allow_lazy(urlquote, unicode) | ||||||
|  |  | ||||||
| @@ -25,7 +25,7 @@ def urlquote_plus(url, safe=''): | |||||||
|     returned string can safely be used as part of an argument to a subsequent |     returned string can safely be used as part of an argument to a subsequent | ||||||
|     iri_to_uri() call without double-quoting occurring. |     iri_to_uri() call without double-quoting occurring. | ||||||
|     """ |     """ | ||||||
|     return force_unicode(urllib.quote_plus(smart_str(url), safe)) |     return force_unicode(urllib.quote_plus(smart_str(url), smart_str(safe))) | ||||||
| urlquote_plus = allow_lazy(urlquote_plus, unicode) | urlquote_plus = allow_lazy(urlquote_plus, unicode) | ||||||
|  |  | ||||||
| def urlencode(query, doseq=0): | def urlencode(query, doseq=0): | ||||||
|   | |||||||
| @@ -1967,6 +1967,19 @@ For example:: | |||||||
| If ``value`` is ``"http://www.example.org/foo?a=b&c=d"``, the output will be | If ``value`` is ``"http://www.example.org/foo?a=b&c=d"``, the output will be | ||||||
| ``"http%3A//www.example.org/foo%3Fa%3Db%26c%3Dd"``. | ``"http%3A//www.example.org/foo%3Fa%3Db%26c%3Dd"``. | ||||||
|  |  | ||||||
|  | .. versionadded:: 1.1 | ||||||
|  |  | ||||||
|  | An optional argument containing the characters which should not be escaped can | ||||||
|  | be provided. | ||||||
|  |  | ||||||
|  | If not provided, the '/' character is assumed safe. An empty string can be | ||||||
|  | provided when *all* characters should be escaped. For example:: | ||||||
|  |  | ||||||
|  |     {{ value|urlencode:"" }} | ||||||
|  |  | ||||||
|  | If ``value`` is ``"http://www.example.org/"``, the output will be | ||||||
|  | ``"http%3A%2F%2Fwww.example.org%2F"``. | ||||||
|  |  | ||||||
| .. templatefilter:: urlize | .. templatefilter:: urlize | ||||||
|  |  | ||||||
| urlize | urlize | ||||||
|   | |||||||
| @@ -265,6 +265,10 @@ def get_filter_tests(): | |||||||
|         'filter-iriencode03': ('{{ url|iriencode }}', {'url': mark_safe('?test=1&me=2')}, '?test=1&me=2'), |         'filter-iriencode03': ('{{ url|iriencode }}', {'url': mark_safe('?test=1&me=2')}, '?test=1&me=2'), | ||||||
|         'filter-iriencode04': ('{% autoescape off %}{{ url|iriencode }}{% endautoescape %}', {'url': mark_safe('?test=1&me=2')}, '?test=1&me=2'), |         'filter-iriencode04': ('{% autoescape off %}{{ url|iriencode }}{% endautoescape %}', {'url': mark_safe('?test=1&me=2')}, '?test=1&me=2'), | ||||||
|  |  | ||||||
|  |         # urlencode | ||||||
|  |         'filter-urlencode01': ('{{ url|urlencode }}', {'url': '/test&"/me?/'}, '/test%26%22/me%3F/'), | ||||||
|  |         'filter-urlencode02': ('/test/{{ urlbit|urlencode:"" }}/', {'urlbit': 'escape/slash'}, '/test/escape%2Fslash/'), | ||||||
|  |  | ||||||
|         # Chaining a bunch of safeness-preserving filters should not alter |         # Chaining a bunch of safeness-preserving filters should not alter | ||||||
|         # the safe status either way. |         # the safe status either way. | ||||||
|         'chaining01': ('{{ a|capfirst|center:"7" }}.{{ b|capfirst|center:"7" }}', {"a": "a < b", "b": mark_safe("a < b")}, " A < b . A < b "), |         'chaining01': ('{{ a|capfirst|center:"7" }}.{{ b|capfirst|center:"7" }}', {"a": "a < b", "b": mark_safe("a < b")}, " A < b . A < b "), | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user