1
0
mirror of https://github.com/django/django.git synced 2024-12-22 17:16:24 +00:00

Fixed #35789 -- Improved the error message raised when the tag must be first in the template.

This commit is contained in:
ekinertac 2024-10-06 15:29:35 +03:00 committed by Sarah Boyce
parent e970bb7ca7
commit 68cee15a8f
2 changed files with 21 additions and 3 deletions

View File

@ -533,9 +533,13 @@ class Parser:
def extend_nodelist(self, nodelist, node, token): def extend_nodelist(self, nodelist, node, token):
# Check that non-text nodes don't appear before an extends tag. # Check that non-text nodes don't appear before an extends tag.
if node.must_be_first and nodelist.contains_nontext: if node.must_be_first and nodelist.contains_nontext:
if self.origin.template_name:
origin = repr(self.origin.template_name)
else:
origin = "the template"
raise self.error( raise self.error(
token, token,
"%r must be the first tag in the template." % node, "{%% %s %%} must be the first tag in %s." % (token.contents, origin),
) )
if not isinstance(node, TextNode): if not isinstance(node, TextNode):
nodelist.contains_nontext = True nodelist.contains_nontext = True

View File

@ -1,9 +1,9 @@
import os import os
from django.template import Context, Engine, TemplateDoesNotExist from django.template import Context, Engine, TemplateDoesNotExist, TemplateSyntaxError
from django.test import SimpleTestCase from django.test import SimpleTestCase
from .utils import ROOT from .utils import ROOT, setup
RECURSIVE = os.path.join(ROOT, "recursive_templates") RECURSIVE = os.path.join(ROOT, "recursive_templates")
@ -181,3 +181,17 @@ class ExtendsBehaviorTests(SimpleTestCase):
) )
template = engine.get_template("base.html") template = engine.get_template("base.html")
self.assertEqual(template.render(Context({})), "12AB") self.assertEqual(template.render(Context({})), "12AB")
@setup(
{"index.html": "{% block content %}B{% endblock %}{% extends 'base.html' %}"}
)
def test_extends_not_first_tag_in_extended_template(self):
msg = "{% extends 'base.html' %} must be the first tag in 'index.html'."
with self.assertRaisesMessage(TemplateSyntaxError, msg):
self.engine.get_template("index.html")
def test_extends_not_first_tag_in_extended_template_from_string(self):
template_string = "{% block content %}B{% endblock %}{% extends 'base.html' %}"
msg = "{% extends 'base.html' %} must be the first tag in the template."
with self.assertRaisesMessage(TemplateSyntaxError, msg):
Engine().from_string(template_string)