How to escape {{ or }} in django template?

PythonDjango

Python Problem Overview


Django treats {{ var }} as some variable in its template. How can I escape {{ var }} or {{ or }} such that django does not treat it as variable.

<p>"{{ some text }}"</p> Should prints exactly the same.

Python Solutions


Solution 1 - Python

Django 1.5 introduced {% verbatim %} template tag. It stops template from parsing contents of this tag:

{% verbatim %}
    {{ var }}
{% endverbatim %}

will be rendered as:

{{ var }}

Solution 2 - Python

I believe you are looking for the templatetag template tag.

As the linked-to doc states,

> Since the template system has no concept of "escaping", to display one of the bits used in template tags, you must use the {% templatetag %} tag.

For example:

<p>"{% templatetag openvariable %} some text {% templatetag closevariable %}"</p>

will appear as so:

<p>"{{ some text }}"</p>

Solution 3 - Python

Edit: I don't really recommended this because it's not very clean, but it's still an option.

I was searching for one that I could use with JQuery Templates and figured a way to do it without tags or filters. This is as short as I could get it:

{{ "{{ any text }" }}}

Is printed as:

{{ any text }}

Why it works? Any text within {{}} is displayed as is, as long as it doesn't have two closing braces }} in a row. Then there are three brackets in a row, django interprets two first ones as end of the variable leaving one additional closing brace.

Solution 4 - Python

You can try escaping with html character escapes like:

{ = &#123;

} = &#125;

<p>"&#123;&#123; some text &#125;&#125;"</p>

Try that inside your browser.

Solution 5 - Python

if you simply need to use {{ }} as a variable for template framework like angularjs, then following maybe simpler:

in your <app path>/templatetags/ngvar.py , add

from django import template
register = template.Library()

@register.simple_tag
def ngvar(var_name):
	return "{{%s}}" % var_name

and in template, do

{% load ngvar %}
{% ngvar "variable name" %}

if ngvar.py is the first template tag, then make sure to add __init__.py file to the templatetags directory

Solution 6 - Python

Another option would be to add a word joiner (zero width no-break space) between each curly bracket:

<p>"{&#8288;{ some text }&#8288;}"</p>

Solution 7 - Python

Although the above answers can solve the original problem, I add some hack around here for those who are scratching their heads like me.

Some times, we want to render a single brace followed by a variable. For example, in BibTeX, there may be something look like this:

@MISC{hu2012-spectral,
	author = {Hu, Pili},
	title = {Spectral Clustering Survey},
	howpublished = {GitHub, https://github.com/hupili/tutorial/tree/master/spectral-clustering},
	month = {May},
	year = {2012}
}

Those bib fields come from template variables. If you write

title = {{{title}}},

jinja can not compile and raise an error. If you write

title = { {{title}} },

there will be extra blanks. The hack around is to store '{' and '}' as variables and use later.

{% set lb = '{' %}
{% set rb = '}' %}
...
@MISC{{lb}}{{ meta.bib_key }},
	author = {{lb}}Hu, Pili{{rb}},
	title = {{lb}}{{ meta.title }}{{rb}},
	howpublished = {{lb}}GitHub, https://github.com/hupili/tutorial/tree/master/{{ auto.path}}{{rb}},
	month = {{lb}}{{ meta.month }}{{rb}},
	year = {{lb}}{{ meta.year }}{{rb}}
}

This looks clumsy but it is the best I find so far. If you have a cleaner solution, please tell me.

Solution 8 - Python

This template tag (designed for use with jQuery Templates) might do the trick. It let's you wrap content you don't want Django to interpret as variables with a template tag.

Solution 9 - Python

it can be solved by avoing adjacent angular backets, if its inside javascript code then you can write

'{'+'{address.'+key+'}}'

I used this to print jinja variables into another template,using javascript.

Solution 10 - Python

Jinja, which is what is being used for the templates, offers several suggestions for escaping here. What has worked best for me is using something like "{% raw %}{{ some text }}{% endraw %}"

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionTauquirView Question on Stackoverflow
Solution 1 - PythonOndrej SlintákView Answer on Stackoverflow
Solution 2 - PythonNateView Answer on Stackoverflow
Solution 3 - PythonLychaView Answer on Stackoverflow
Solution 4 - PythonGuilherme David da CostaView Answer on Stackoverflow
Solution 5 - PythonAndrew HongView Answer on Stackoverflow
Solution 6 - PythonAndrew ClarkView Answer on Stackoverflow
Solution 7 - PythonPili HuView Answer on Stackoverflow
Solution 8 - PythonKinsaView Answer on Stackoverflow
Solution 9 - PythonRohith K PView Answer on Stackoverflow
Solution 10 - PythonSeanView Answer on Stackoverflow