Changeset 9530
- Timestamp:
- 11/24/08 16:01:48 (2 months ago)
- Files:
-
- django/trunk/django/template/defaulttags.py (modified) (6 diffs)
- django/trunk/docs/ref/templates/builtins.txt (modified) (1 diff)
- django/trunk/tests/regressiontests/templates/tests.py (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
django/trunk/django/template/defaulttags.py
r8716 r9530 84 84 85 85 class ForNode(Node): 86 def __init__(self, loopvars, sequence, is_reversed, nodelist_loop ):86 def __init__(self, loopvars, sequence, is_reversed, nodelist_loop, nodelist_empty=None): 87 87 self.loopvars, self.sequence = loopvars, sequence 88 88 self.is_reversed = is_reversed 89 89 self.nodelist_loop = nodelist_loop 90 if nodelist_empty is None: 91 self.nodelist_empty = NodeList() 92 else: 93 self.nodelist_empty = nodelist_empty 90 94 91 95 def __repr__(self): … … 98 102 for node in self.nodelist_loop: 99 103 yield node 104 for node in self.nodelist_empty: 105 yield node 100 106 101 107 def get_nodes_by_type(self, nodetype): … … 104 110 nodes.append(self) 105 111 nodes.extend(self.nodelist_loop.get_nodes_by_type(nodetype)) 112 nodes.extend(self.nodelist_empty.get_nodes_by_type(nodetype)) 106 113 return nodes 107 114 108 115 def render(self, context): 109 nodelist = NodeList()110 116 if 'forloop' in context: 111 117 parentloop = context['forloop'] … … 122 128 values = list(values) 123 129 len_values = len(values) 130 if len_values < 1: 131 return self.nodelist_empty.render(context) 132 nodelist = NodeList() 124 133 if self.is_reversed: 125 134 values = reversed(values) … … 611 620 {% endfor %} 612 621 622 The ``for`` tag can take an optional ``{% empty %}`` clause that will 623 be displayed if the given array is empty or could not be found:: 624 625 <ul> 626 {% for athlete in athlete_list %} 627 <li>{{ athlete.name }}</li> 628 {% empty %} 629 <li>Sorry, no athletes in this list.</li> 630 {% endfor %} 631 <ul> 632 633 The above is equivalent to -- but shorter, cleaner, and possibly faster 634 than -- the following:: 635 636 <ul> 637 {% if althete_list %} 638 {% for athlete in athlete_list %} 639 <li>{{ athlete.name }}</li> 640 {% endfor %} 641 {% else %} 642 <li>Sorry, no athletes in this list.</li> 643 {% endif %} 644 </ul> 645 613 646 The for loop sets a number of variables available within the loop: 614 647 … … 647 680 648 681 sequence = parser.compile_filter(bits[in_index+1]) 649 nodelist_loop = parser.parse(('endfor',)) 650 parser.delete_first_token() 651 return ForNode(loopvars, sequence, is_reversed, nodelist_loop) 682 nodelist_loop = parser.parse(('default', 'endfor',)) 683 token = parser.next_token() 684 if token.contents == 'default': 685 nodelist_default = parser.parse(('endfor',)) 686 parser.delete_first_token() 687 else: 688 nodelist_default = None 689 return ForNode(loopvars, sequence, is_reversed, nodelist_loop, nodelist_default) 652 690 do_for = register.tag("for", do_for) 653 691 django/trunk/docs/ref/templates/builtins.txt
r9529 r9530 234 234 current one 235 235 ========================== ================================================ 236 237 for ... empty 238 ^^^^^^^^^^^^^ 239 240 .. versionadded:: 1.1 241 242 The ``for`` tag can take an optional ``{% empty %}`` clause that will be 243 displayed if the given array is empty or could not be found:: 244 245 <ul> 246 {% for athlete in athlete_list %} 247 <li>{{ athlete.name }}</li> 248 {% empty %} 249 <li>Sorry, no athlete in this list!</li> 250 {% endfor %} 251 <ul> 252 253 The above is equivalent to -- but shorter, cleaner, and possibly faster 254 than -- the following:: 255 256 <ul> 257 {% if althete_list %} 258 {% for athlete in athlete_list %} 259 <li>{{ athlete.name }}</li> 260 {% endfor %} 261 {% else %} 262 <li>Sorry, no athletes in this list.</li> 263 {% endif %} 264 </ul> 236 265 237 266 .. templatetag:: if django/trunk/tests/regressiontests/templates/tests.py
r9161 r9530 485 485 'for-tag-unpack12': ("{% for x,y,z in items %}{{ x }}:{{ y }},{{ z }}/{% endfor %}", {"items": (('one', 1, 'carrot'), ('two', 2))}, ("one:1,carrot/two:2,/", "one:1,carrot/two:2,INVALID/")), 486 486 'for-tag-unpack13': ("{% for x,y,z in items %}{{ x }}:{{ y }},{{ z }}/{% endfor %}", {"items": (('one', 1, 'carrot'), ('two', 2, 'cheese'))}, ("one:1,carrot/two:2,cheese/", "one:1,carrot/two:2,cheese/")), 487 'for-tag-default01': ("{% for val in values %}{{ val }}{% default %}default text{% endfor %}", {"values": [1, 2, 3]}, "123"), 488 'for-tag-default02': ("{% for val in values %}{{ val }}{% default %}values array empty{% endfor %}", {"values": []}, "values array empty"), 489 'for-tag-default03': ("{% for val in values %}{{ val }}{% default %}values array not found{% endfor %}", {}, "values array not found"), 487 490 488 491 ### IF TAG ################################################################
