Fixed #26118 -- Added 'is' operator to if template tag.

This commit is contained in:
Preston Timmons 2016-01-21 21:50:06 -06:00 committed by Tim Graham
parent a08d2463d2
commit c00ae7f58c
4 changed files with 25 additions and 1 deletions

View File

@ -98,6 +98,7 @@ OPERATORS = {
'not': prefix(8, lambda context, x: not x.eval(context)),
'in': infix(9, lambda context, x, y: x.eval(context) in y.eval(context)),
'not in': infix(9, lambda context, x, y: x.eval(context) not in y.eval(context)),
'is': infix(10, lambda context, x, y: x.eval(context) is y.eval(context)),
'==': infix(10, lambda context, x, y: x.eval(context) == y.eval(context)),
'!=': infix(10, lambda context, x, y: x.eval(context) != y.eval(context)),
'>': infix(10, lambda context, x, y: x.eval(context) > y.eval(context)),

View File

@ -432,7 +432,7 @@ Use of actual parentheses in the :ttag:`if` tag is invalid syntax. If you need
them to indicate precedence, you should use nested :ttag:`if` tags.
:ttag:`if` tags may also use the operators ``==``, ``!=``, ``<``, ``>``,
``<=``, ``>=`` and ``in`` which work as follows:
``<=``, ``>=``, ``in``, and ``is`` which work as follows:
``==`` operator
^^^^^^^^^^^^^^^
@ -524,6 +524,17 @@ you should use::
{% if a > b and b > c %}
``is`` operator
^^^^^^^^^^^^^^^
.. versionadded:: 1.10
Object identity. Tests if two values are the same object. Example::
{% if value is None %}
This will output if and only if value is None.
{% endif %}
Filters
~~~~~~~

View File

@ -291,6 +291,8 @@ Templates
:class:`~django.template.backends.django.DjangoTemplates` backend and the
:class:`~django.template.Engine` class.
* Added the ``is`` comparison operator to the :ttag:`if` tag.
Tests
~~~~~

View File

@ -527,3 +527,13 @@ class IfTagTests(SimpleTestCase):
# A single equals sign is a syntax error.
with self.assertRaises(TemplateSyntaxError):
self.engine.render_to_string('if-tag-single-eq', {'foo': 1})
@setup({'template': '{% if foo is True %}yes{% else %}no{% endif %}'})
def test_if_is_match(self):
output = self.engine.render_to_string('template', {'foo': True})
self.assertEqual(output, 'yes')
@setup({'template': '{% if foo is True %}yes{% else %}no{% endif %}'})
def test_if_is_no_match(self):
output = self.engine.render_to_string('template', {'foo': 1})
self.assertEqual(output, 'no')