Opened 14 years ago
Closed 13 years ago
#16355 closed Bug (wontfix)
TemplateSyntaxError raised by do_block do not allow using doublicate block
| Reported by: | Owned by: | anonymous | |
|---|---|---|---|
| Component: | Template system | Version: | 1.3 |
| Severity: | Normal | Keywords: | |
| Cc: | Triage Stage: | Design decision needed | |
| Has patch: | no | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
This ticket is related to changeset: https://code.djangoproject.com/changeset/12655 and ticket:
https://code.djangoproject.com/ticket/10975
I realised that django template system supports construction like this:
{% ifnotequal setting u'inverted'%}
{% block a %}{% endblock %}
{% block b %}{% endblock %}
{% else %}
{% block b %}{% endblock %}
{% block a %}{% endblock %}
{% endifnotequal %}
but function do_block raises TemplateSyntaxError when checking for duplicate block in template.
Original in django 1.3:
django/template/loader_tags.py
def do_block(parser, token):
"""
Define a block that can be overridden by child templates.
"""
bits = token.contents.split()
if len(bits) != 2:
raise TemplateSyntaxError("'%s' tag takes only one argument" % bits[0])
block_name = bits[1]
# Keep track of the names of BlockNodes found in this template, so we can
# check for duplication.
try:
if block_name in parser.__loaded_blocks:
raise TemplateSyntaxError("'%s' tag with name '%s' appears more than once" % (bits[0], block_name))
parser.__loaded_blocks.append(block_name)
except AttributeError: # parser.__loaded_blocks isn't a list yet
parser.__loaded_blocks = [block_name]
nodelist = parser.parse(('endblock', 'endblock %s' % block_name))
parser.delete_first_token()
return BlockNode(block_name, nodelist)
I just removed 2 lines and construction like above starts working as expected.
def do_block(parser, token):
"""
Define a block that can be overridden by child templates.
"""
bits = token.contents.split()
if len(bits) != 2:
raise TemplateSyntaxError("'%s' tag takes only one argument" % bits[0])
block_name = bits[1]
# Keep track of the names of BlockNodes found in this template, so we can
# check for duplication.
try:
parser.__loaded_blocks.append(block_name)
except AttributeError: # parser.__loaded_blocks isn't a list yet
parser.__loaded_blocks = [block_name]
nodelist = parser.parse(('endblock', 'endblock %s' % block_name))
parser.delete_first_token()
return BlockNode(block_name, nodelist)
Change History (3)
comment:1 by , 14 years ago
| Has patch: | unset |
|---|---|
| Owner: | changed from to |
| Status: | new → assigned |
| Triage Stage: | Unreviewed → Design decision needed |
comment:3 by , 13 years ago
| Resolution: | → wontfix |
|---|---|
| Status: | assigned → closed |
SmileyChris refers to a more specific inconsistency between if and ifequal: https://code.djangoproject.com/ticket/6510#comment:16
I believe ubernostrum's comment also applies here.
(Taking this to django-developers is also the way to go if you think my wontfix is incorrect.)
Setting as DDN because this should be brought to the developers list.
Quoting ubernostrum from #10975:
Didn't mark as wontfix because in same ticket SmileyChris stated that wontfix bug was fixed.