mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Refs #25236 -- Removed {% ifequal %} and {% ifnotequal %} template tags per deprecation timeline.
This commit is contained in:
		| @@ -8,7 +8,6 @@ from itertools import cycle as itertools_cycle, groupby | ||||
|  | ||||
| from django.conf import settings | ||||
| from django.utils import timezone | ||||
| from django.utils.deprecation import RemovedInDjango40Warning | ||||
| from django.utils.html import conditional_escape, format_html | ||||
| from django.utils.lorem_ipsum import paragraphs, words | ||||
| from django.utils.safestring import mark_safe | ||||
| @@ -261,26 +260,6 @@ class IfChangedNode(Node): | ||||
|             return context.render_context | ||||
|  | ||||
|  | ||||
| class IfEqualNode(Node): | ||||
|     # RemovedInDjango40Warning. | ||||
|     child_nodelists = ('nodelist_true', 'nodelist_false') | ||||
|  | ||||
|     def __init__(self, var1, var2, nodelist_true, nodelist_false, negate): | ||||
|         self.var1, self.var2 = var1, var2 | ||||
|         self.nodelist_true, self.nodelist_false = nodelist_true, nodelist_false | ||||
|         self.negate = negate | ||||
|  | ||||
|     def __repr__(self): | ||||
|         return '<%s>' % self.__class__.__name__ | ||||
|  | ||||
|     def render(self, context): | ||||
|         val1 = self.var1.resolve(context, ignore_failures=True) | ||||
|         val2 = self.var2.resolve(context, ignore_failures=True) | ||||
|         if (self.negate and val1 != val2) or (not self.negate and val1 == val2): | ||||
|             return self.nodelist_true.render(context) | ||||
|         return self.nodelist_false.render(context) | ||||
|  | ||||
|  | ||||
| class IfNode(Node): | ||||
|  | ||||
|     def __init__(self, conditions_nodelists): | ||||
| @@ -821,62 +800,6 @@ def do_for(parser, token): | ||||
|     return ForNode(loopvars, sequence, is_reversed, nodelist_loop, nodelist_empty) | ||||
|  | ||||
|  | ||||
| def do_ifequal(parser, token, negate): | ||||
|     # RemovedInDjango40Warning. | ||||
|     bits = list(token.split_contents()) | ||||
|     if len(bits) != 3: | ||||
|         raise TemplateSyntaxError("%r takes two arguments" % bits[0]) | ||||
|     end_tag = 'end' + bits[0] | ||||
|     nodelist_true = parser.parse(('else', end_tag)) | ||||
|     token = parser.next_token() | ||||
|     if token.contents == 'else': | ||||
|         nodelist_false = parser.parse((end_tag,)) | ||||
|         parser.delete_first_token() | ||||
|     else: | ||||
|         nodelist_false = NodeList() | ||||
|     val1 = parser.compile_filter(bits[1]) | ||||
|     val2 = parser.compile_filter(bits[2]) | ||||
|     return IfEqualNode(val1, val2, nodelist_true, nodelist_false, negate) | ||||
|  | ||||
|  | ||||
| @register.tag | ||||
| def ifequal(parser, token): | ||||
|     """ | ||||
|     Output the contents of the block if the two arguments equal each other. | ||||
|  | ||||
|     Examples:: | ||||
|  | ||||
|         {% ifequal user.id comment.user_id %} | ||||
|             ... | ||||
|         {% endifequal %} | ||||
|  | ||||
|         {% ifnotequal user.id comment.user_id %} | ||||
|             ... | ||||
|         {% else %} | ||||
|             ... | ||||
|         {% endifnotequal %} | ||||
|     """ | ||||
|     warnings.warn( | ||||
|         'The {% ifequal %} template tag is deprecated in favor of {% if %}.', | ||||
|         RemovedInDjango40Warning, | ||||
|     ) | ||||
|     return do_ifequal(parser, token, False) | ||||
|  | ||||
|  | ||||
| @register.tag | ||||
| def ifnotequal(parser, token): | ||||
|     """ | ||||
|     Output the contents of the block if the two arguments are not equal. | ||||
|     See ifequal. | ||||
|     """ | ||||
|     warnings.warn( | ||||
|         'The {% ifnotequal %} template tag is deprecated in favor of ' | ||||
|         '{% if %}.', | ||||
|         RemovedInDjango40Warning, | ||||
|     ) | ||||
|     return do_ifequal(parser, token, True) | ||||
|  | ||||
|  | ||||
| class TemplateLiteral(Literal): | ||||
|     def __init__(self, value, text): | ||||
|         self.value = value | ||||
|   | ||||
| @@ -608,15 +608,6 @@ you should use:: | ||||
|  | ||||
|     {% if a > b and b > c %} | ||||
|  | ||||
| ``ifequal`` and ``ifnotequal`` | ||||
| ------------------------------ | ||||
|  | ||||
| .. deprecated:: 3.1 | ||||
|  | ||||
| ``{% ifequal a b %} ... {% endifequal %}`` is an obsolete way to write | ||||
| ``{% if a == b %} ... {% endif %}``. Likewise, ``{% ifnotequal a b %} ... | ||||
| {% endifnotequal %}`` is superseded by ``{% if a != b %} ... {% endif %}``. | ||||
|  | ||||
| .. templatetag:: ifchanged | ||||
|  | ||||
| ``ifchanged`` | ||||
|   | ||||
| @@ -321,3 +321,5 @@ to remove usage of these features. | ||||
|   ``django.contrib.postgres.fields.jsonb.KeyTextTransform`` are removed. | ||||
|  | ||||
| * ``django.contrib.postgres.forms.JSONField`` is removed. | ||||
|  | ||||
| * The ``{% ifequal %}`` and ``{% ifnotequal %}`` template tags are removed. | ||||
|   | ||||
| @@ -1,6 +1,5 @@ | ||||
| from django.template import TemplateSyntaxError | ||||
| from django.test import SimpleTestCase, ignore_warnings | ||||
| from django.utils.deprecation import RemovedInDjango40Warning | ||||
| from django.test import SimpleTestCase | ||||
| from django.utils.safestring import mark_safe | ||||
|  | ||||
| from ..utils import SafeClass, UnsafeClass, setup | ||||
| @@ -82,15 +81,6 @@ class AutoescapeTagTests(SimpleTestCase): | ||||
|         with self.assertRaises(TemplateSyntaxError): | ||||
|             self.engine.render_to_string('autoescape-filtertag01', {'first': '<a>'}) | ||||
|  | ||||
|     @ignore_warnings(category=RemovedInDjango40Warning) | ||||
|     @setup({'autoescape-ifequal01': '{% ifequal var "this & that" %}yes{% endifequal %}'}) | ||||
|     def test_autoescape_ifequal01(self): | ||||
|         """ | ||||
|         ifequal compares unescaped vales. | ||||
|         """ | ||||
|         output = self.engine.render_to_string('autoescape-ifequal01', {'var': 'this & that'}) | ||||
|         self.assertEqual(output, 'yes') | ||||
|  | ||||
|     # Arguments to filters are 'safe' and manipulate their input unescaped. | ||||
|     @setup({'autoescape-filters01': '{{ var|cut:"&" }}'}) | ||||
|     def test_autoescape_filters01(self): | ||||
|   | ||||
| @@ -1,257 +0,0 @@ | ||||
| from django.template import TemplateSyntaxError | ||||
| from django.template.defaulttags import IfEqualNode | ||||
| from django.test import SimpleTestCase, ignore_warnings | ||||
| from django.utils.deprecation import RemovedInDjango40Warning | ||||
|  | ||||
| from ..utils import setup | ||||
|  | ||||
|  | ||||
| @ignore_warnings(category=RemovedInDjango40Warning) | ||||
| class IfEqualTagTests(SimpleTestCase): | ||||
|  | ||||
|     @setup({'ifequal01': '{% ifequal a b %}yes{% endifequal %}'}) | ||||
|     def test_ifequal01(self): | ||||
|         output = self.engine.render_to_string('ifequal01', {'a': 1, 'b': 2}) | ||||
|         self.assertEqual(output, '') | ||||
|  | ||||
|     @setup({'ifequal02': '{% ifequal a b %}yes{% endifequal %}'}) | ||||
|     def test_ifequal02(self): | ||||
|         output = self.engine.render_to_string('ifequal02', {'a': 1, 'b': 1}) | ||||
|         self.assertEqual(output, 'yes') | ||||
|  | ||||
|     @setup({'ifequal03': '{% ifequal a b %}yes{% else %}no{% endifequal %}'}) | ||||
|     def test_ifequal03(self): | ||||
|         output = self.engine.render_to_string('ifequal03', {'a': 1, 'b': 2}) | ||||
|         self.assertEqual(output, 'no') | ||||
|  | ||||
|     @setup({'ifequal04': '{% ifequal a b %}yes{% else %}no{% endifequal %}'}) | ||||
|     def test_ifequal04(self): | ||||
|         output = self.engine.render_to_string('ifequal04', {'a': 1, 'b': 1}) | ||||
|         self.assertEqual(output, 'yes') | ||||
|  | ||||
|     @setup({'ifequal05': '{% ifequal a \'test\' %}yes{% else %}no{% endifequal %}'}) | ||||
|     def test_ifequal05(self): | ||||
|         output = self.engine.render_to_string('ifequal05', {'a': 'test'}) | ||||
|         self.assertEqual(output, 'yes') | ||||
|  | ||||
|     @setup({'ifequal06': '{% ifequal a \'test\' %}yes{% else %}no{% endifequal %}'}) | ||||
|     def test_ifequal06(self): | ||||
|         output = self.engine.render_to_string('ifequal06', {'a': 'no'}) | ||||
|         self.assertEqual(output, 'no') | ||||
|  | ||||
|     @setup({'ifequal07': '{% ifequal a "test" %}yes{% else %}no{% endifequal %}'}) | ||||
|     def test_ifequal07(self): | ||||
|         output = self.engine.render_to_string('ifequal07', {'a': 'test'}) | ||||
|         self.assertEqual(output, 'yes') | ||||
|  | ||||
|     @setup({'ifequal08': '{% ifequal a "test" %}yes{% else %}no{% endifequal %}'}) | ||||
|     def test_ifequal08(self): | ||||
|         output = self.engine.render_to_string('ifequal08', {'a': 'no'}) | ||||
|         self.assertEqual(output, 'no') | ||||
|  | ||||
|     @setup({'ifequal09': '{% ifequal a "test" %}yes{% else %}no{% endifequal %}'}) | ||||
|     def test_ifequal09(self): | ||||
|         output = self.engine.render_to_string('ifequal09') | ||||
|         self.assertEqual(output, 'no') | ||||
|  | ||||
|     @setup({'ifequal10': '{% ifequal a b %}yes{% else %}no{% endifequal %}'}) | ||||
|     def test_ifequal10(self): | ||||
|         output = self.engine.render_to_string('ifequal10') | ||||
|         self.assertEqual(output, 'yes') | ||||
|  | ||||
|     # SMART SPLITTING | ||||
|     @setup({'ifequal-split01': '{% ifequal a "test man" %}yes{% else %}no{% endifequal %}'}) | ||||
|     def test_ifequal_split01(self): | ||||
|         output = self.engine.render_to_string('ifequal-split01') | ||||
|         self.assertEqual(output, 'no') | ||||
|  | ||||
|     @setup({'ifequal-split02': '{% ifequal a "test man" %}yes{% else %}no{% endifequal %}'}) | ||||
|     def test_ifequal_split02(self): | ||||
|         output = self.engine.render_to_string('ifequal-split02', {'a': 'foo'}) | ||||
|         self.assertEqual(output, 'no') | ||||
|  | ||||
|     @setup({'ifequal-split03': '{% ifequal a "test man" %}yes{% else %}no{% endifequal %}'}) | ||||
|     def test_ifequal_split03(self): | ||||
|         output = self.engine.render_to_string('ifequal-split03', {'a': 'test man'}) | ||||
|         self.assertEqual(output, 'yes') | ||||
|  | ||||
|     @setup({'ifequal-split04': '{% ifequal a \'test man\' %}yes{% else %}no{% endifequal %}'}) | ||||
|     def test_ifequal_split04(self): | ||||
|         output = self.engine.render_to_string('ifequal-split04', {'a': 'test man'}) | ||||
|         self.assertEqual(output, 'yes') | ||||
|  | ||||
|     @setup({'ifequal-split05': '{% ifequal a \'i "love" you\' %}yes{% else %}no{% endifequal %}'}) | ||||
|     def test_ifequal_split05(self): | ||||
|         output = self.engine.render_to_string('ifequal-split05', {'a': ''}) | ||||
|         self.assertEqual(output, 'no') | ||||
|  | ||||
|     @setup({'ifequal-split06': '{% ifequal a \'i "love" you\' %}yes{% else %}no{% endifequal %}'}) | ||||
|     def test_ifequal_split06(self): | ||||
|         output = self.engine.render_to_string('ifequal-split06', {'a': 'i "love" you'}) | ||||
|         self.assertEqual(output, 'yes') | ||||
|  | ||||
|     @setup({'ifequal-split07': '{% ifequal a \'i "love" you\' %}yes{% else %}no{% endifequal %}'}) | ||||
|     def test_ifequal_split07(self): | ||||
|         output = self.engine.render_to_string('ifequal-split07', {'a': 'i love you'}) | ||||
|         self.assertEqual(output, 'no') | ||||
|  | ||||
|     @setup({'ifequal-split08': r"{% ifequal a 'I\'m happy' %}yes{% else %}no{% endifequal %}"}) | ||||
|     def test_ifequal_split08(self): | ||||
|         output = self.engine.render_to_string('ifequal-split08', {'a': "I'm happy"}) | ||||
|         self.assertEqual(output, 'yes') | ||||
|  | ||||
|     @setup({'ifequal-split09': r"{% ifequal a 'slash\man' %}yes{% else %}no{% endifequal %}"}) | ||||
|     def test_ifequal_split09(self): | ||||
|         output = self.engine.render_to_string('ifequal-split09', {'a': r'slash\man'}) | ||||
|         self.assertEqual(output, 'yes') | ||||
|  | ||||
|     @setup({'ifequal-split10': r"{% ifequal a 'slash\man' %}yes{% else %}no{% endifequal %}"}) | ||||
|     def test_ifequal_split10(self): | ||||
|         output = self.engine.render_to_string('ifequal-split10', {'a': 'slashman'}) | ||||
|         self.assertEqual(output, 'no') | ||||
|  | ||||
|     # NUMERIC RESOLUTION | ||||
|     @setup({'ifequal-numeric01': '{% ifequal x 5 %}yes{% endifequal %}'}) | ||||
|     def test_ifequal_numeric01(self): | ||||
|         output = self.engine.render_to_string('ifequal-numeric01', {'x': '5'}) | ||||
|         self.assertEqual(output, '') | ||||
|  | ||||
|     @setup({'ifequal-numeric02': '{% ifequal x 5 %}yes{% endifequal %}'}) | ||||
|     def test_ifequal_numeric02(self): | ||||
|         output = self.engine.render_to_string('ifequal-numeric02', {'x': 5}) | ||||
|         self.assertEqual(output, 'yes') | ||||
|  | ||||
|     @setup({'ifequal-numeric03': '{% ifequal x 5.2 %}yes{% endifequal %}'}) | ||||
|     def test_ifequal_numeric03(self): | ||||
|         output = self.engine.render_to_string('ifequal-numeric03', {'x': 5}) | ||||
|         self.assertEqual(output, '') | ||||
|  | ||||
|     @setup({'ifequal-numeric04': '{% ifequal x 5.2 %}yes{% endifequal %}'}) | ||||
|     def test_ifequal_numeric04(self): | ||||
|         output = self.engine.render_to_string('ifequal-numeric04', {'x': 5.2}) | ||||
|         self.assertEqual(output, 'yes') | ||||
|  | ||||
|     @setup({'ifequal-numeric05': '{% ifequal x 0.2 %}yes{% endifequal %}'}) | ||||
|     def test_ifequal_numeric05(self): | ||||
|         output = self.engine.render_to_string('ifequal-numeric05', {'x': 0.2}) | ||||
|         self.assertEqual(output, 'yes') | ||||
|  | ||||
|     @setup({'ifequal-numeric06': '{% ifequal x .2 %}yes{% endifequal %}'}) | ||||
|     def test_ifequal_numeric06(self): | ||||
|         output = self.engine.render_to_string('ifequal-numeric06', {'x': 0.2}) | ||||
|         self.assertEqual(output, 'yes') | ||||
|  | ||||
|     @setup({'ifequal-numeric07': '{% ifequal x 2. %}yes{% endifequal %}'}) | ||||
|     def test_ifequal_numeric07(self): | ||||
|         output = self.engine.render_to_string('ifequal-numeric07', {'x': 2}) | ||||
|         self.assertEqual(output, '') | ||||
|  | ||||
|     @setup({'ifequal-numeric08': '{% ifequal x "5" %}yes{% endifequal %}'}) | ||||
|     def test_ifequal_numeric08(self): | ||||
|         output = self.engine.render_to_string('ifequal-numeric08', {'x': 5}) | ||||
|         self.assertEqual(output, '') | ||||
|  | ||||
|     @setup({'ifequal-numeric09': '{% ifequal x "5" %}yes{% endifequal %}'}) | ||||
|     def test_ifequal_numeric09(self): | ||||
|         output = self.engine.render_to_string('ifequal-numeric09', {'x': '5'}) | ||||
|         self.assertEqual(output, 'yes') | ||||
|  | ||||
|     @setup({'ifequal-numeric10': '{% ifequal x -5 %}yes{% endifequal %}'}) | ||||
|     def test_ifequal_numeric10(self): | ||||
|         output = self.engine.render_to_string('ifequal-numeric10', {'x': -5}) | ||||
|         self.assertEqual(output, 'yes') | ||||
|  | ||||
|     @setup({'ifequal-numeric11': '{% ifequal x -5.2 %}yes{% endifequal %}'}) | ||||
|     def test_ifequal_numeric11(self): | ||||
|         output = self.engine.render_to_string('ifequal-numeric11', {'x': -5.2}) | ||||
|         self.assertEqual(output, 'yes') | ||||
|  | ||||
|     @setup({'ifequal-numeric12': '{% ifequal x +5 %}yes{% endifequal %}'}) | ||||
|     def test_ifequal_numeric12(self): | ||||
|         output = self.engine.render_to_string('ifequal-numeric12', {'x': 5}) | ||||
|         self.assertEqual(output, 'yes') | ||||
|  | ||||
|     # FILTER EXPRESSIONS AS ARGUMENTS | ||||
|     @setup({'ifequal-filter01': '{% ifequal a|upper "A" %}x{% endifequal %}'}) | ||||
|     def test_ifequal_filter01(self): | ||||
|         output = self.engine.render_to_string('ifequal-filter01', {'a': 'a'}) | ||||
|         self.assertEqual(output, 'x') | ||||
|  | ||||
|     @setup({'ifequal-filter02': '{% ifequal "A" a|upper %}x{% endifequal %}'}) | ||||
|     def test_ifequal_filter02(self): | ||||
|         output = self.engine.render_to_string('ifequal-filter02', {'a': 'a'}) | ||||
|         self.assertEqual(output, 'x') | ||||
|  | ||||
|     @setup({'ifequal-filter03': '{% ifequal a|upper b|upper %}x{% endifequal %}'}) | ||||
|     def test_ifequal_filter03(self): | ||||
|         output = self.engine.render_to_string('ifequal-filter03', {'a': 'x', 'b': 'X'}) | ||||
|         self.assertEqual(output, 'x') | ||||
|  | ||||
|     @setup({'ifequal-filter04': '{% ifequal x|slice:"1" "a" %}x{% endifequal %}'}) | ||||
|     def test_ifequal_filter04(self): | ||||
|         output = self.engine.render_to_string('ifequal-filter04', {'x': 'aaa'}) | ||||
|         self.assertEqual(output, 'x') | ||||
|  | ||||
|     @setup({'ifequal-filter05': '{% ifequal x|slice:"1"|upper "A" %}x{% endifequal %}'}) | ||||
|     def test_ifequal_filter05(self): | ||||
|         output = self.engine.render_to_string('ifequal-filter05', {'x': 'aaa'}) | ||||
|         self.assertEqual(output, 'x') | ||||
|  | ||||
|  | ||||
| @ignore_warnings(category=RemovedInDjango40Warning) | ||||
| class IfNotEqualTagTests(SimpleTestCase): | ||||
|  | ||||
|     @setup({'ifnotequal01': '{% ifnotequal a b %}yes{% endifnotequal %}'}) | ||||
|     def test_ifnotequal01(self): | ||||
|         output = self.engine.render_to_string('ifnotequal01', {'a': 1, 'b': 2}) | ||||
|         self.assertEqual(output, 'yes') | ||||
|  | ||||
|     @setup({'ifnotequal02': '{% ifnotequal a b %}yes{% endifnotequal %}'}) | ||||
|     def test_ifnotequal02(self): | ||||
|         output = self.engine.render_to_string('ifnotequal02', {'a': 1, 'b': 1}) | ||||
|         self.assertEqual(output, '') | ||||
|  | ||||
|     @setup({'ifnotequal03': '{% ifnotequal a b %}yes{% else %}no{% endifnotequal %}'}) | ||||
|     def test_ifnotequal03(self): | ||||
|         output = self.engine.render_to_string('ifnotequal03', {'a': 1, 'b': 2}) | ||||
|         self.assertEqual(output, 'yes') | ||||
|  | ||||
|     @setup({'ifnotequal04': '{% ifnotequal a b %}yes{% else %}no{% endifnotequal %}'}) | ||||
|     def test_ifnotequal04(self): | ||||
|         output = self.engine.render_to_string('ifnotequal04', {'a': 1, 'b': 1}) | ||||
|         self.assertEqual(output, 'no') | ||||
|  | ||||
|     @setup({'one_var': '{% ifnotequal a %}yes{% endifnotequal %}'}) | ||||
|     def test_one_var(self): | ||||
|         with self.assertRaisesMessage(TemplateSyntaxError, "'ifnotequal' takes two arguments"): | ||||
|             self.engine.render_to_string('one_var', {'a': 1}) | ||||
|  | ||||
|  | ||||
| class DeprecationTests(SimpleTestCase): | ||||
|     @setup( | ||||
|         {'ifequal_warning': '{% ifequal a b %}yes{% endifequal %}'}, | ||||
|         test_once=True, | ||||
|     ) | ||||
|     def test_ifequal_warning(self): | ||||
|         msg = ( | ||||
|             'The {% ifequal %} template tag is deprecated in favor of ' | ||||
|             '{% if %}.' | ||||
|         ) | ||||
|         with self.assertRaisesMessage(RemovedInDjango40Warning, msg): | ||||
|             self.engine.render_to_string('ifequal_warning', {'a': 1, 'b': 2}) | ||||
|  | ||||
|     @setup( | ||||
|         {'ifnotequal_warning': '{% ifnotequal a b %}yes{% endifnoequal %}'}, | ||||
|         test_once=True, | ||||
|     ) | ||||
|     def test_ifnotequal_warning(self): | ||||
|         msg = ( | ||||
|             'The {% ifnotequal %} template tag is deprecated in favor of ' | ||||
|             '{% if %}.' | ||||
|         ) | ||||
|         with self.assertRaisesMessage(RemovedInDjango40Warning, msg): | ||||
|             self.engine.render_to_string('ifnotequal_warning', {'a': 1, 'b': 2}) | ||||
|  | ||||
|     def test_repr(self): | ||||
|         node = IfEqualNode(var1='a', var2='b', nodelist_true=[], nodelist_false=[], negate=False) | ||||
|         self.assertEqual(repr(node), '<IfEqualNode>') | ||||
| @@ -1,7 +1,6 @@ | ||||
| from django.template import Context, Engine | ||||
| from django.template.base import TextNode, VariableNode | ||||
| from django.test import SimpleTestCase, ignore_warnings | ||||
| from django.utils.deprecation import RemovedInDjango40Warning | ||||
| from django.test import SimpleTestCase | ||||
|  | ||||
|  | ||||
| class NodelistTest(SimpleTestCase): | ||||
| @@ -21,12 +20,6 @@ class NodelistTest(SimpleTestCase): | ||||
|         vars = template.nodelist.get_nodes_by_type(VariableNode) | ||||
|         self.assertEqual(len(vars), 1) | ||||
|  | ||||
|     @ignore_warnings(category=RemovedInDjango40Warning) | ||||
|     def test_ifequal(self): | ||||
|         template = self.engine.from_string('{% ifequal x y %}{{ a }}{% endifequal %}') | ||||
|         vars = template.nodelist.get_nodes_by_type(VariableNode) | ||||
|         self.assertEqual(len(vars), 1) | ||||
|  | ||||
|     def test_ifchanged(self): | ||||
|         template = self.engine.from_string('{% ifchanged x %}{{ a }}{% endifchanged %}') | ||||
|         vars = template.nodelist.get_nodes_by_type(VariableNode) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user