How to escape {{ or }} in django template?
PythonDjangoPython 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:
{ = {
} = }
<p>"{{ some text }}"</p>
Try that inside your browser.
Solution 5 - Python
if you simply need to use {{
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>"{⁠{ some text }⁠}"</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 %}"