Changes between Initial Version and Version 12 of Ticket #3090


Ignore:
Timestamp:
07/29/2009 06:45:46 AM (6 years ago)
Author:
russellm
Comment:

Following discussion on django-developers, it looks like this ticket may have been closed in error - the snippet may solve the same problem (elseif/case), but doesn't address the core issue of the ticket. The description on #3100, which was closed as a duplicate of this ticket, is much more enlightening as to the actual problem. To that end, I've reopened #3100.

Legend:

Unmodified
Added
Removed
Modified
  • Ticket #3090

    • Property Status changed from new to closed
    • Property Component changed from Core framework to Template system
    • Property Summary changed from [Patch]Extend enclose tag process to Support for arguments on intermediate tag tokens (ex. {% if arg %}{% elif arg %}{% endif %})
    • Property Needs documentation set
    • Property Resolution changed from to invalid
    • Property Triage Stage changed from Unreviewed to Design decision needed
  • Ticket #3090 – Description

    initial v12  
    1 I want to extend `if` to `pyif` tag. And I also want to implement `elif` tag support, just like:
     1Currently the template functionality prevents creation of tags which have intermediate tags requiring arguments.
    22
     3For instance:
    34{{{
    4     {% pyif i == 1 %}
    5         <p>i=1</p>
    6     {% elif i == 3 %}
    7         <p>i=3</p>
    8     {% else %}
    9         <p>other</p>
    10     {% endif %}
     5{% myif arg %}
     6  first block
     7{% elif arg %}  <-- current version would fail to parse this correctly because of the arg
     8  second block
     9{% endmyif %}
    1110}}}
    1211
    13 So you can see `elif` has en expression. But I found current django `template/__init__.py` can not support enclose tag process just like `elif`, because it has extra info. And the code in `template/__init__.py` is:
    14 
    15 {{{
    16 elif token.token_type == TOKEN_BLOCK:
    17     if token.contents in parse_until:
    18         # put token back on token list so calling code knows why it terminated
    19         self.prepend_token(token)
    20         return nodelist
    21     try:
    22         command = token.contents.split()[0]
    23     except IndexError:
    24         self.empty_block_tag(token)
    25 }}}
    26 
    27 So you can see django use `token.contents in parse_until` to determin if it encounter an enclose tag, and doesn't support extra info after the enclose tag. So if I extend `elif` and add extra expression, it'll failed and raise:
    28 
    29 {{{
    30 Invalid block tag: 'elif'
    31 }}}
    32 
    33 So I made this patch so that django can just judge the tagname but not the whole token.contents.
     12The attached patch removes this restriction.
Back to Top