diff --git a/django/template/base.py b/django/template/base.py index 10a1f114642..9c81a361f26 100644 --- a/django/template/base.py +++ b/django/template/base.py @@ -762,17 +762,16 @@ class Variable: # Note that this could cause an OverflowError here that we're not # catching. Since this should only happen at compile time, that's # probably OK. - self.literal = float(var) - - # So it's a float... is it an int? If the original value contained a - # dot or an "e" then it was a float, not an int. - if '.' not in var and 'e' not in var.lower(): - self.literal = int(self.literal) - - # "2." is invalid - if var.endswith('.'): - raise ValueError + # Try to interpret values containg a period or an 'e'/'E' + # (possibly scientific notation) as a float; otherwise, try int. + if '.' in var or 'e' in var.lower(): + self.literal = float(var) + # "2." is invalid + if var.endswith('.'): + raise ValueError + else: + self.literal = int(var) except ValueError: # A ValueError means that the variable isn't a number. if var.startswith('_(') and var.endswith(')'): diff --git a/tests/template_tests/test_base.py b/tests/template_tests/test_base.py index 5320af5e9ac..4012a89f7da 100644 --- a/tests/template_tests/test_base.py +++ b/tests/template_tests/test_base.py @@ -1,4 +1,4 @@ -from django.template.base import VariableDoesNotExist +from django.template.base import Variable, VariableDoesNotExist from django.test import SimpleTestCase @@ -6,3 +6,8 @@ class VariableDoesNotExistTests(SimpleTestCase): def test_str(self): exc = VariableDoesNotExist(msg='Failed lookup in %r', params=({'foo': 'bar'},)) self.assertEqual(str(exc), "Failed lookup in {'foo': 'bar'}") + + +class VariableTests(SimpleTestCase): + def test_integer_literals(self): + self.assertEqual(Variable('999999999999999999999999999').literal, 999999999999999999999999999)