Opened 16 years ago
Closed 10 years ago
#7377 closed Bug (worksforme)
"extends" and "block" tags are not available when constructing template from scratch
Reported by: | Owned by: | Stephen Burrows | |
---|---|---|---|
Component: | Template system | Version: | dev |
Severity: | Normal | Keywords: | |
Cc: | elsdoerfer@… | Triage Stage: | Accepted |
Has patch: | yes | Needs documentation: | no |
Needs tests: | yes | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
with a fresh svn chekcout, made a new project, and run:
./manage.py shell
In [1]: from django.template import Template, Context In [2]: t = Template('''{% block title %}Hello{% end block %}''') --------------------------------------------------------------------------- TemplateSyntaxError Traceback (most recent call last) /Users/mattgeorge/django-code/gapp/<ipython console> in <module>() /Library/Python/2.5/site-packages/django/template/__init__.py in __init__(self, template_string, origin, name) 164 if settings.TEMPLATE_DEBUG and origin is None: 165 origin = StringOrigin(template_string) --> 166 self.nodelist = compile_string(template_string, origin) 167 self.name = name 168 /Library/Python/2.5/site-packages/django/template/__init__.py in compile_string(template_string, origin) 185 lexer = lexer_class(template_string, origin) 186 parser = parser_class(lexer.tokenize()) --> 187 return parser.parse() 188 189 class Token(object): /Library/Python/2.5/site-packages/django/template/__init__.py in parse(self, parse_until) 267 compile_func = self.tags[command] 268 except KeyError: --> 269 self.invalid_block_tag(token, command) 270 try: 271 compiled_result = compile_func(self, token) /Library/Python/2.5/site-packages/django/template/__init__.py in invalid_block_tag(self, token, command) 319 320 def invalid_block_tag(self, token, command): --> 321 raise self.error(token, "Invalid block tag: '%s'" % command) 322 323 def unclosed_block_tag(self, parse_until): TemplateSyntaxError: Invalid block tag: 'block'
however, this works:
Matt-George:gapp mattgeorge$./manage.py shell Python 2.5.1 (r251:54863, Jan 17 2008, 19:35:17) Type "copyright", "credits" or "license" for more information. IPython 0.8.2 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython's features. %quickref -> Quick reference. help -> Python's own help system. object? -> Details about 'object'. ?object also works, ?? prints more. In [1]: from django.template import Template, Context In [2]: from django.template.loader import * In [3]: t = Template('''{% block title %}Hello{% endblock %}''')
it looks like the issue comes from the line:
add_to_builtins('django.template.loader_tags')
in django.template.loader
Attachments (1)
Change History (19)
comment:1 by , 16 years ago
Resolution: | → invalid |
---|---|
Status: | new → closed |
comment:2 by , 16 years ago
Resolution: | invalid |
---|---|
Status: | closed → reopened |
that was a typo from an old terminal. It happens even with the {% endblock %}
In [1]: from django.template import Template, Context In [2]: t = Template('''{% block title %}Hello{% endblock %}''') --------------------------------------------------------------------------- TemplateSyntaxError Traceback (most recent call last)
comment:3 by , 16 years ago
This is not a problem with Django:
In [1]: from django.template import Template In [2]: t= Template('{% block title %}Hello{% endblock %}')
If you continue to have this problem try asking on the mailing-list or in #django on freenode, trac is not the correct place for handling usage problems.
comment:4 by , 16 years ago
Resolution: | → invalid |
---|---|
Status: | reopened → closed |
comment:5 by , 16 years ago
Resolution: | invalid |
---|---|
Status: | closed → reopened |
Triage Stage: | Unreviewed → Accepted |
by , 16 years ago
Attachment: | template_loader.diff added |
---|
comment:6 by , 16 years ago
Has patch: | set |
---|
comment:7 by , 16 years ago
Triage Stage: | Accepted → Design decision needed |
---|
Hmm, I could see an argument for this *not* being a bug. If you're constructing a template from scratch, bypassing the template-loading infrastructure, using "{% extends %}" and "{% block %}" is meaningless. I'll leave it open for discussion, though.
comment:8 by , 16 years ago
Summary: | TemplateSyntaxError: Invalid block tag: 'block' → "extends" and "block" tags are not available when constructing template from scratch |
---|
comment:9 by , 16 years ago
This would be fixed by the refactoring proposed in #7806 (as a side effect).
comment:10 by , 16 years ago
For what it's worth, {% extends %}
and {% block %}
aren't entirely meaningless outside the context of standard template-loading. Since {% extends %}
can take a fully-formed Template
object as its argument, it's quite possible (or at least, could be) to construct an inherited structure while still bypassing template loaders. Admittedly, using a string in {% extends %}
without a template loader isn't realistic (and using {% block %}
without {% extends %}
would be useless), but I just wanted to point out one supported situation that is indeed impossible with this setup.
comment:11 by , 16 years ago
Cc: | added |
---|
comment:12 by , 14 years ago
Severity: | → Normal |
---|---|
Type: | → Bug |
comment:13 by , 13 years ago
Easy pickings: | unset |
---|---|
Triage Stage: | Design decision needed → Accepted |
UI/UX: | unset |
Given Gulopine's comment, I don't see any reason not to treat this as a bug.
comment:14 by , 12 years ago
FWIW all you have to do to get the desired behavior is import django.template.loader anywhere in your program. Magic!
comment:15 by , 12 years ago
Owner: | changed from | to
---|---|
Status: | reopened → new |
I've made a pull request which fixes this ticket: https://github.com/django/django/pull/414. This seems to just have been a matter of adding the loader tags to builtins at the same time that the defaulttags and defaultfilters are added. Doing so doesn't cause any new issues to appear... so unless there's something I'm missing, this should be good to go.
(I don't have tests, but I can't think of a way to add an automated test for this.)
comment:16 by , 12 years ago
Status: | new → assigned |
---|
comment:17 by , 12 years ago
Needs tests: | set |
---|
@melinath: To test this, you can create a python subprocess that executes some code snippet in which you only import django.template
, but not the loaders. It's also worth checking what happens in that scenario if I pass a string to extends
.
comment:18 by , 10 years ago
Resolution: | → worksforme |
---|---|
Status: | assigned → closed |
I don't think that this exists anymore in master.
That error occurred because you had {% end block %} in place of {% endblock %}.