开发者

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

开发者 https://www.devze.com 2023-04-13 07:00 出处:网络
Django treats {{ var }} as some variable in i开发者_高级运维ts template. How can I escape {{ var }} or {{ or }} such that django does not treat it as variable.

Django treats {{ var }} as some variable in i开发者_高级运维ts 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.


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

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

will be rendered as:

{{ var }}


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>


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.


You can try escaping with html character escapes like:

{ = &#123;

} = &#125;

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

Update

In case anyone is trying to use the actual tags for javascript, verbatim is a better solution:

Stops the template engine from rendering the contents of this block tag.

{% verbatim %}
    {{if dying}}Still alive.{{/if}}
{% endverbatim %}


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


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

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


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.


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.


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.


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 %}"

0

精彩评论

暂无评论...
验证码 换一张
取 消