-
-
Notifications
You must be signed in to change notification settings - Fork 100
Description
I often have a hard time finding the source of problems in my Django Components templates. I can work around it by deleting parts of the templates until the exception goes away, but this can be time-consuming.
I would expect the filename, or component name, to be included in the exception message, and a line number as well. But in many cases, the component name doesn't appear in the message, and just as often, none of my project's code is in the stack at all.
I'm including a couple of examples here.
This first exception, which was actually pretty quick to find the cause of, appeared in the console as soon as I started the server (python manage.py runserver
). It contains what looks like a valid line number, but not the name of the component or the template file.
Watching for file changes with StatReloader
[2025-10-07 21:48:04 UTC] [django.utils.autoreload:667] [INFO] Watching for file changes with StatReloader
Exception in thread django-main-thread:
Traceback (most recent call last):
File "/usr/lib/python3.13/threading.py", line 1043, in _bootstrap_inner
self.run()
~~~~~~~~^^
File "/usr/lib/python3.13/threading.py", line 994, in run
self._target(*self._args, **self._kwargs)
~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/utils/autoreload.py", line 64, in wrapper
fn(*args, **kwargs)
~~^^^^^^^^^^^^^^^^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/core/management/commands/runserver.py", line 124, in inner_run
autoreload.raise_last_exception()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/utils/autoreload.py", line 86, in raise_last_exception
raise _exception[1]
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/core/management/__init__.py", line 394, in execute
autoreload.check_errors(django.setup)()
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/utils/autoreload.py", line 64, in wrapper
fn(*args, **kwargs)
~~^^^^^^^^^^^^^^^^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/__init__.py", line 24, in setup
apps.populate(settings.INSTALLED_APPS)
~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/apps/registry.py", line 124, in populate
app_config.ready()
~~~~~~~~~~~~~~~~^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/apps.py", line 70, in ready
extensions._init_app()
~~~~~~~~~~~~~~~~~~~~^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/extension.py", line 1177, in _init_app
getattr(self, hook)(data)
~~~~~~~~~~~~~~~~~~~^^^^^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/extension.py", line 960, in wrapper
return func(self, ctx)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/extension.py", line 1250, in on_component_class_created
extension.on_component_class_created(ctx)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/extensions/dependencies.py", line 20, in on_component_class_created
cache_component_js(ctx.component_cls, force=True)
~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/dependencies.py", line 116, in cache_component_js
if not comp_cls.js or not is_nonempty_str(comp_cls.js):
^^^^^^^^^^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/component_media.py", line 410, in __get__
return get_comp_media_attr(self._attr_name)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/component_media.py", line 397, in get_comp_media_attr
return _get_comp_cls_attr(comp_cls, attr)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/component_media.py", line 426, in _get_comp_cls_attr
_resolve_media(base, comp_media)
~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/component_media.py", line 623, in _resolve_media
template_str, template_obj = _get_asset(
~~~~~~~~~~^
comp_cls,
^^^^^^^^^
...<3 lines>...
comp_dirs=comp_dirs,
^^^^^^^^^^^^^^^^^^^^
)
^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/component_media.py", line 1115, in _get_asset
template = load_component_template(comp_cls, filepath=asset_file, content=None)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/template.py", line 185, in load_component_template
template = _load_django_template(filepath)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/template.py", line 352, in _load_django_template
return django_get_template(template_name).template
~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/loader.py", line 15, in get_template
return engine.get_template(template_name)
~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/backends/django.py", line 79, in get_template
return Template(self.engine.get_template(template_name), self)
~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/engine.py", line 177, in get_template
template, origin = self.find_template(template_name)
~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/engine.py", line 159, in find_template
template = loader.get_template(name, skip=skip)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/loaders/cached.py", line 57, in get_template
template = super().get_template(template_name, skip)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/loaders/base.py", line 28, in get_template
return Template(
contents,
...<2 lines>...
self.engine,
)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/util/django_monkeypatch.py", line 78, in __init__
original_init(self, template_string, origin, name, *args, **kwargs) # type: ignore[misc]
~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/base.py", line 154, in __init__
self.nodelist = self.compile_nodelist()
~~~~~~~~~~~~~~~~~~~~~^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/util/django_monkeypatch.py", line 121, in _compile_nodelist
nodelist = parser.parse()
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/base.py", line 518, in parse
raise self.error(token, e)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/base.py", line 516, in parse
compiled_result = compile_func(self, token)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/component_registry.py", line 566, in tag_fn
return ComponentNode.parse(
~~~~~~~~~~~~~~~~~~~^
parser,
^^^^^^^
...<4 lines>...
end_tag=end_tag,
^^^^^^^^^^^^^^^^
)
^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/component.py", line 3963, in parse
node: ComponentNode = super(cls, cached_subcls).parse( # type: ignore[attr-defined]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
parser,
^^^^^^^
...<2 lines>...
name=name,
^^^^^^^^^^
)
^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/node.py", line 551, in parse
body, contents = tag.parse_body()
~~~~~~~~~~~~~~^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/util/template_tag.py", line 160, in <lambda>
parse_body=lambda: _parse_tag_body(parser, end_tag, is_inline) if end_tag else (NodeList(), None),
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/util/template_tag.py", line 149, in _parse_tag_body
body = parser.parse(parse_until=[end_tag])
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/base.py", line 518, in parse
raise self.error(token, e)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/base.py", line 516, in parse
compiled_result = compile_func(self, token)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/component_registry.py", line 566, in tag_fn
return ComponentNode.parse(
~~~~~~~~~~~~~~~~~~~^
parser,
^^^^^^^
...<4 lines>...
end_tag=end_tag,
^^^^^^^^^^^^^^^^
)
^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/component.py", line 3963, in parse
node: ComponentNode = super(cls, cached_subcls).parse( # type: ignore[attr-defined]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
parser,
^^^^^^^
...<2 lines>...
name=name,
^^^^^^^^^^
)
^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/node.py", line 551, in parse
body, contents = tag.parse_body()
~~~~~~~~~~~~~~^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/util/template_tag.py", line 160, in <lambda>
parse_body=lambda: _parse_tag_body(parser, end_tag, is_inline) if end_tag else (NodeList(), None),
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/util/template_tag.py", line 149, in _parse_tag_body
body = parser.parse(parse_until=[end_tag])
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/base.py", line 523, in parse
self.unclosed_block_tag(parse_until)
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/base.py", line 590, in unclosed_block_tag
raise self.error(token, msg)
django.template.exceptions.TemplateSyntaxError: Unclosed tag on line 7: 'component'. Looking for one of: endcomponent.
The following exception didn't appear until I tried to load the page I'm working on. It says the error is on line 173, but none of my component templates have that many lines, so I presume this refers to a line in a combined template that ultimately gets fed to Django. Is there a way to see what that template looks like, to help find the problem?
For other exceptions, line numbers aren't shown at all, or they're ridiculously large.
Traceback (most recent call last):
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/base.py", line 510, in parse
compile_func = self.tags[command]
~~~~~~~~~^^^^^^^^^
KeyError: 'endif'
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/core/handlers/wsgi.py", line 124, in __call__
response = self.get_response(request)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/core/handlers/base.py", line 140, in get_response
response = self._middleware_chain(request)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/core/handlers/exception.py", line 57, in inner
response = response_for_exception(request, exc)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/core/handlers/exception.py", line 141, in response_for_exception
response = handle_uncaught_exception(
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/core/handlers/exception.py", line 182, in handle_uncaught_exception
return debug.technical_500_response(request, *exc_info)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_extensions/management/technical_response.py", line 41, in null_technical_500_response
raise exc_value.with_traceback(tb)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/core/handlers/exception.py", line 55, in inner
response = get_response(request)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/core/handlers/base.py", line 220, in _get_response
response = response.render()
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/response.py", line 114, in render
self.content = self.rendered_content
^^^^^^^^^^^^^^^^^^^^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/response.py", line 90, in rendered_content
template = self.resolve_template(self.template_name)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/response.py", line 74, in resolve_template
return get_template(template, using=self.using)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/loader.py", line 15, in get_template
return engine.get_template(template_name)
~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/backends/django.py", line 79, in get_template
return Template(self.engine.get_template(template_name), self)
~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/engine.py", line 177, in get_template
template, origin = self.find_template(template_name)
~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/engine.py", line 159, in find_template
template = loader.get_template(name, skip=skip)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/loaders/cached.py", line 57, in get_template
template = super().get_template(template_name, skip)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/loaders/base.py", line 28, in get_template
return Template(
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/util/django_monkeypatch.py", line 78, in __init__
original_init(self, template_string, origin, name, *args, **kwargs) # type: ignore[misc]
~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/base.py", line 154, in __init__
self.nodelist = self.compile_nodelist()
~~~~~~~~~~~~~~~~~~~~~^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/util/django_monkeypatch.py", line 121, in _compile_nodelist
nodelist = parser.parse()
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/base.py", line 518, in parse
raise self.error(token, e)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/base.py", line 516, in parse
compiled_result = compile_func(self, token)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/loader_tags.py", line 299, in do_extends
nodelist = parser.parse()
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/base.py", line 518, in parse
raise self.error(token, e)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/base.py", line 516, in parse
compiled_result = compile_func(self, token)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/loader_tags.py", line 234, in do_block
nodelist = parser.parse(("endblock",))
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/base.py", line 518, in parse
raise self.error(token, e)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/base.py", line 516, in parse
compiled_result = compile_func(self, token)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/component_registry.py", line 566, in tag_fn
return ComponentNode.parse(
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/component.py", line 3963, in parse
node: ComponentNode = super(cls, cached_subcls).parse( # type: ignore[attr-defined]
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/node.py", line 551, in parse
body, contents = tag.parse_body()
~~~~~~~~~~~~~~^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/util/template_tag.py", line 160, in <lambda>
parse_body=lambda: _parse_tag_body(parser, end_tag, is_inline) if end_tag else (NodeList(), None),
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/util/template_tag.py", line 149, in _parse_tag_body
body = parser.parse(parse_until=[end_tag])
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/base.py", line 518, in parse
raise self.error(token, e)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/base.py", line 516, in parse
compiled_result = compile_func(self, token)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/defaulttags.py", line 862, in do_for
nodelist_loop = parser.parse(
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/base.py", line 518, in parse
raise self.error(token, e)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/base.py", line 516, in parse
compiled_result = compile_func(self, token)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/defaulttags.py", line 962, in do_if
nodelist = parser.parse(("elif", "else", "endif"))
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/base.py", line 518, in parse
raise self.error(token, e)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/base.py", line 516, in parse
compiled_result = compile_func(self, token)
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/component_registry.py", line 566, in tag_fn
return ComponentNode.parse(
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/component.py", line 3963, in parse
node: ComponentNode = super(cls, cached_subcls).parse( # type: ignore[attr-defined]
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/node.py", line 551, in parse
body, contents = tag.parse_body()
~~~~~~~~~~~~~~^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/util/template_tag.py", line 160, in <lambda>
parse_body=lambda: _parse_tag_body(parser, end_tag, is_inline) if end_tag else (NodeList(), None),
~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django_components/util/template_tag.py", line 149, in _parse_tag_body
body = parser.parse(parse_until=[end_tag])
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/base.py", line 512, in parse
self.invalid_block_tag(token, command, parse_until)
~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/home/mscheper/git/myproject/venv/lib/python3.13/site-packages/django/template/base.py", line 567, in invalid_block_tag
raise self.error(
^
django.template.exceptions.TemplateSyntaxError: Invalid block tag on line 173: 'endif', expected 'endcomponent'. Did you forget to register or load this tag?
Metadata
Metadata
Assignees
Labels
Type
Projects
Status