Răsfoiți Sursa

Fixed #18400 -- Modified length template filter to return 0 for unknown variables.

Thanks Florian for the bug report, luyikei for the initial code patch, and
Bouke for the code review feedback.
Susan Tan 11 ani în urmă
părinte
comite
484f3edf1e

+ 1 - 1
django/template/defaultfilters.py

@@ -578,7 +578,7 @@ def length(value):
     try:
         return len(value)
     except (ValueError, TypeError):
-        return ''
+        return 0
 
 
 @register.filter(is_safe=False)

+ 5 - 0
docs/ref/templates/builtins.txt

@@ -1688,6 +1688,11 @@ For example::
 If ``value`` is ``['a', 'b', 'c', 'd']`` or ``"abcd"``, the output will be
 ``4``.
 
+.. versionchanged:: 1.8
+
+    The filter returns ``0`` for an undefined variable. Previously, it returned
+    an empty string.
+
 .. templatefilter:: length_is
 
 length_is

+ 3 - 0
docs/releases/1.8.txt

@@ -267,6 +267,9 @@ Miscellaneous
 
 * ``django.contrib.gis`` dropped support for GEOS 3.1 and GDAL 1.6.
 
+* The :tfilter:`length` template filter now returns ``0`` for an undefined
+  variable, rather than an empty string.
+
 .. _deprecated-features-1.8:
 
 Features deprecated in 1.8

+ 2 - 2
tests/template_tests/filters.py

@@ -322,8 +322,8 @@ def get_filter_tests():
         'length04': ('{{ string|length }}', {'string': 'django'}, '6'),
         'length05': ('{% if string|length == 6 %}Pass{% endif %}', {'string': mark_safe('django')}, 'Pass'),
         # Invalid uses that should fail silently.
-        'length06': ('{{ int|length }}', {'int': 7}, ''),
-        'length07': ('{{ None|length }}', {'None': None}, ''),
+        'length06': ('{{ int|length }}', {'int': 7}, '0'),
+        'length07': ('{{ None|length }}', {'None': None}, '0'),
 
         # length_is filter.
         'length_is01': ('{% if some_list|length_is:"4" %}Four{% endif %}', {'some_list': ['4', None, True, {}]}, 'Four'),