Ticket #6398: add_else_to_for.diff
File add_else_to_for.diff, 3.8 KB (added by , 17 years ago) |
---|
-
django/template/defaulttags.py
84 84 return u'' 85 85 86 86 class ForNode(Node): 87 def __init__(self, loopvars, sequence, is_reversed, nodelist_loop ):87 def __init__(self, loopvars, sequence, is_reversed, nodelist_loop, nodelist_false): 88 88 self.loopvars, self.sequence = loopvars, sequence 89 89 self.is_reversed = is_reversed 90 self.nodelist_loop = nodelist_loop90 self.nodelist_loop, self.nodelist_false = nodelist_loop, nodelist_false 91 91 92 92 def __repr__(self): 93 93 reversed_text = self.is_reversed and ' reversed' or '' … … 98 98 def __iter__(self): 99 99 for node in self.nodelist_loop: 100 100 yield node 101 for node in self.nodelist_false: 102 yield node 101 103 102 104 def get_nodes_by_type(self, nodetype): 103 105 nodes = [] 104 106 if isinstance(self, nodetype): 105 107 nodes.append(self) 106 108 nodes.extend(self.nodelist_loop.get_nodes_by_type(nodetype)) 109 nodes.extend(self.nodelist_false.get_nodes_by_type(nodetype)) 107 110 return nodes 108 111 109 112 def render(self, context): … … 122 125 if not hasattr(values, '__len__'): 123 126 values = list(values) 124 127 len_values = len(values) 128 if len_values < 1: 129 return self.nodelist_false.render(context) 125 130 if self.is_reversed: 126 131 values = reversed(values) 127 132 unpack = len(self.loopvars) > 1 … … 575 580 #@register.tag(name="for") 576 581 def do_for(parser, token): 577 582 """ 578 Loops over each item in an array .583 Loops over each item in an array, with support of ``else``. 579 584 580 585 For example, to display a list of athletes given ``athlete_list``:: 581 586 … … 594 599 {{ key }}: {{ value }} 595 600 {% endfor %} 596 601 602 As you can see, the ``for`` tag can take an option ``{% else %}`` clause 603 that will be displayed if the given array is empty:: 604 605 <ul> 606 {% for athlete in athlete_list %} 607 <li>{{ athlete.name }}</li> 608 {% else %} 609 <li>Sorry, no athlete in this list!</li> 610 {% endfor %} 611 <ul> 612 597 613 The for loop sets a number of variables available within the loop: 598 614 599 615 ========================== ================================================ … … 630 646 " %s" % token.contents) 631 647 632 648 sequence = parser.compile_filter(bits[in_index+1]) 633 nodelist_loop = parser.parse(('endfor',)) 634 parser.delete_first_token() 635 return ForNode(loopvars, sequence, is_reversed, nodelist_loop) 649 nodelist_loop = parser.parse(('else', 'endfor',)) 650 token = parser.next_token() 651 if token.contents == 'else': 652 nodelist_false = parser.parse(('endfor',)) 653 parser.delete_first_token() 654 else: 655 nodelist_false = NodeList() 656 return ForNode(loopvars, sequence, is_reversed, nodelist_loop, nodelist_false) 636 657 do_for = register.tag("for", do_for) 637 658 638 659 def do_ifequal(parser, token, negate): -
docs/templates.txt
717 717 {{ key }}: {{ value }} 718 718 {% endfor %} 719 719 720 **New in Django development version** 721 As you can see, the ``for`` tag can take an optional ``{% else %}`` clause 722 that will be displayed if the given array is empty:: 723 724 <ul> 725 {% for athlete in athlete_list %} 726 <li>{{ athlete.name }}</li> 727 {% else %} 728 <li>Sorry, no athlete in this list!</li> 729 {% endfor %} 730 <ul> 731 720 732 The for loop sets a number of variables available within the loop: 721 733 722 734 ========================== ================================================