fabio
fabio

Reputation: 1365

Why django finds errors inside comment blocks in template?

Sometime Django finds an error in a template. I Would like to comment out the row to debug but django keeps to find the error even in the comment.

For example this link give me an error because url 'prova' don't exist.

<!--<a href="{% url 'prova' %}">Prova</a><br/>-->

another example: here {{ field }} give an error (and I don't know why but this is another problem)

   <!--{% for field in form.visible_fields %}
    {{ field.errors }}
    {{ field.label }}
    {{ field }}
    {{ field.help_text }}
    <br />
  {% endfor %}-->

Maybe there's another way to comment?

Thank you

Upvotes: 2

Views: 1396

Answers (2)

Guzman Ojero
Guzman Ojero

Reputation: 3457

Be careful with HTML Comments.

HTML comments are not ignored by the Django parser. If there is an error inside the comment, an error will still be raised.

In your example, the URL doesn't exist, so:

NoReverseMatch: Reverse for 'prova' not found. 'prova' is not a valid view function or pattern name.

Let's see another example.

Go to a Django project and write this line in a template

<!-- {% if context %} -->

What happens is that Django will raise this error:

TemplateSyntaxError: Unclosed tag on line XXX: 'if'. Looking for one of: elif, else, endif.

Wait, what? Why is a comment raising an error? Aren't comments ignored? Well... yes and no.*


Why is this happening?

  • The Django template engine parses everything, including content inside HTML comments. So html comments aren't ignored (the no part).*

  • When it encounters {% if context %}, even if it's inside an html comment, it expects a matching {% endif %}. Since the endif is missing, an error is raised.

  • Django treats HTML comments <!-- ... --> as text, not as special syntax.

  • HTML comments are meant to be passed to the browser, although they are not displayed. Django processes their content because it doesn’t know you intend them to be ignored. Try it, make an html comment and then check the page source, html comments are there.


And if you close the tag, no error happens.

<!-- {% if context %} {% endif %} -->


What to do if I want to make a comment with no risk of error?

Use Django's Template comments and not html's. Django template's comments are ignored and aren't passed to the browser (the yes part).*

You have two options:

  1. Use comment syntax to comment-out part of a line in a template:
{# {% if context %} #}
  1. Use the comment tag for multiline comment, it ignores everything between them.
{% comment %}  {% if context %} {% endcomment %}

Upvotes: 1

Daniel Roseman
Daniel Roseman

Reputation: 599778

Django still parses the code; it doesn't care about HTML comments. If you want to ensure that it does not get rendered at all, you should use the Django comment tags, {% comment %}...{% endcomment %}.

For a single line, you can wrap things in {# ... #}.

See the docs.

Upvotes: 13

Related Questions