Django

Code

Ticket #6398: add_default_to_for.diff

File add_default_to_for.diff, 3.8 kB (added by jezdez, 1 year ago)

Second implementation, including documentation

  • django/template/defaulttags.py

    old new  
    8484        return u'' 
    8585 
    8686class ForNode(Node): 
    87     def __init__(self, loopvars, sequence, is_reversed, nodelist_loop): 
     87    def __init__(self, loopvars, sequence, is_reversed, nodelist_loop, nodelist_default): 
    8888        self.loopvars, self.sequence = loopvars, sequence 
    8989        self.is_reversed = is_reversed 
    90         self.nodelist_loop = nodelist_loop 
     90        self.nodelist_loop, self.nodelist_default = nodelist_loop, nodelist_default 
    9191 
    9292    def __repr__(self): 
    9393        reversed_text = self.is_reversed and ' reversed' or '' 
     
    9898    def __iter__(self): 
    9999        for node in self.nodelist_loop: 
    100100            yield node 
     101        for node in self.nodelist_default: 
     102            yield node 
    101103 
    102104    def get_nodes_by_type(self, nodetype): 
    103105        nodes = [] 
    104106        if isinstance(self, nodetype): 
    105107            nodes.append(self) 
    106108        nodes.extend(self.nodelist_loop.get_nodes_by_type(nodetype)) 
     109        nodes.extend(self.nodelist_default.get_nodes_by_type(nodetype)) 
    107110        return nodes 
    108111 
    109112    def render(self, context): 
     
    122125        if not hasattr(values, '__len__'): 
    123126            values = list(values) 
    124127        len_values = len(values) 
     128        if len_values < 1: 
     129            return self.nodelist_default.render(context) 
    125130        if self.is_reversed: 
    126131            values = reversed(values) 
    127132        unpack = len(self.loopvars) > 1 
     
    575580#@register.tag(name="for") 
    576581def do_for(parser, token): 
    577582    """ 
    578     Loops over each item in an array
     583    Loops over each item in an array, with support of ``else``
    579584 
    580585    For example, to display a list of athletes given ``athlete_list``:: 
    581586 
     
    594599            {{ key }}: {{ value }} 
    595600        {% endfor %} 
    596601 
     602    As you can see, the ``for`` tag can take an option ``{% default %}`` 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        {% default %} 
     609            <li>Sorry, no athlete in this list!</li> 
     610        {% endfor %} 
     611        <ul> 
     612 
    597613    The for loop sets a number of variables available within the loop: 
    598614 
    599615        ==========================  ================================================ 
     
    630646                                      " %s" % token.contents) 
    631647 
    632648    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(('default', 'endfor',)) 
     650    token = parser.next_token() 
     651    if token.contents == 'default': 
     652        nodelist_default = parser.parse(('endfor',)) 
     653        parser.delete_first_token() 
     654    else: 
     655        nodelist_default = NodeList() 
     656    return ForNode(loopvars, sequence, is_reversed, nodelist_loop, nodelist_default) 
    636657do_for = register.tag("for", do_for) 
    637658 
    638659def do_ifequal(parser, token, negate): 
  • docs/templates.txt

    old new  
    717717        {{ key }}: {{ value }} 
    718718    {% endfor %} 
    719719 
     720**New in Django development version** 
     721As you can see, the ``for`` tag can take an optional ``{% default %}`` clause 
     722that will be displayed if the given array is empty:: 
     723 
     724    <ul> 
     725    {% for athlete in athlete_list %} 
     726        <li>{{ athlete.name }}</li> 
     727    {% default %} 
     728        <li>Sorry, no athlete in this list!</li> 
     729    {% endfor %} 
     730    <ul> 
     731 
    720732The for loop sets a number of variables available within the loop: 
    721733 
    722734    ==========================  ================================================