Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

Template filters now pass numerical arguments through as numbers.

This was the (undocumented) behaviour prior to r10118 and now it's back
again. It's neither hard nor harmful to maintain compatibility with the
old ways.

git-svn-id: http://code.djangoproject.com/svn/django/trunk@10169 bcc190cf-cafb-0310-a4f2-bffc1f526a37
  • Loading branch information...
commit 2c6c60cec613246bff5cb0be831969c20417b53c 1 parent 7f63d00
Malcolm Tredinnick malcolmt authored
12 django/template/__init__.py
View
@@ -445,16 +445,17 @@ def value(self):
self.pointer = i
return s
+# This only matches constant *strings* (things in quotes or marked for
+# translation). Numbers are treated as variables for implementation reasons
+# (so that they retain their type when passed to filters).
constant_string = r"""
(?:%(i18n_open)s%(strdq)s%(i18n_close)s|
%(i18n_open)s%(strsq)s%(i18n_close)s|
%(strdq)s|
-%(strsq)s)|
-%(num)s
+%(strsq)s)
""" % {
'strdq': r'"[^"\\]*(?:\\.[^"\\]*)*"', # double-quoted string
'strsq': r"'[^'\\]*(?:\\.[^'\\]*)*'", # single-quoted string
- 'num': r'[-+\.]?\d[\d\.e]*', # numeric constant
'i18n_open' : re.escape("_("),
'i18n_close' : re.escape(")"),
}
@@ -462,17 +463,18 @@ def value(self):
filter_raw_string = r"""
^(?P<constant>%(constant)s)|
-^(?P<var>[%(var_chars)s]+)|
+^(?P<var>[%(var_chars)s]+|%(num)s)|
(?:%(filter_sep)s
(?P<filter_name>\w+)
(?:%(arg_sep)s
(?:
(?P<constant_arg>%(constant)s)|
- (?P<var_arg>[%(var_chars)s]+)
+ (?P<var_arg>[%(var_chars)s]+|%(num)s)
)
)?
)""" % {
'constant': constant_string,
+ 'num': r'[-+\.]?\d[\d\.e]*',
'var_chars': "\w\." ,
'filter_sep': re.escape(FILTER_SEPARATOR),
'arg_sep': re.escape(FILTER_ARGUMENT_SEPARATOR),
11 tests/regressiontests/templates/custom.py
View
@@ -0,0 +1,11 @@
+from django import test
+from django import template
+
+
+custom_filters = """
+>>> t = template.Template("{% load custom %}{{ string|trim:5 }}")
+>>> ctxt = template.Context({"string": "abcdefghijklmnopqrstuvwxyz"})
+>>> t.render(ctxt)
+u"abcde"
+"""
+
0  tests/regressiontests/templates/templatetags/__init__.py
View
No changes.
11 tests/regressiontests/templates/templatetags/custom.py
View
@@ -0,0 +1,11 @@
+from django import template
+from django.template.defaultfilters import stringfilter
+
+register = template.Library()
+
+def trim(value, num):
+ return value[:num]
+trim = stringfilter(trim)
+
+register.filter(trim)
+
4 tests/regressiontests/templates/tests.py
View
@@ -18,9 +18,10 @@
from django.utils.safestring import mark_safe
from django.utils.tzinfo import LocalTimezone
-from unicode import unicode_tests
from context import context_tests
+from custom import custom_filters
from parser import filter_parsing, variable_parsing
+from unicode import unicode_tests
try:
from loaders import *
@@ -34,6 +35,7 @@
'unicode': unicode_tests,
'context': context_tests,
'filter_parsing': filter_parsing,
+ 'custom_filters': custom_filters,
}
#################################
Please sign in to comment.
Something went wrong with that request. Please try again.