jQuery.tmpl() and Django

383 views
Skip to first unread message

Ori Livneh

unread,
May 26, 2011, 11:14:51 PM5/26/11
to Django developers
Hello,

jQuery.tmpl(), a beta feature slated for inclusion in the main jQuery
brach, uses some of the same syntax as Django in its templating
markup, which is a bit of a bummer. I'm writing to see whether you
think we should get in touch with the jQuery team to see if they could
plausibly change it.

There are, obviously, quite a lot of templating languages out there,
and some of them are bound to clash with Django, and that's not a
problem. But Django and jQuery are often deployed together (jQuery is
actually bundled with Django for use in the admin), making this clash
especially annoying.

You might think this isn't an issue since JavaScript code should be
served from static files anyway, but there's an added complication.
One of the patterns jQuery.tmpl() recommends is nesting templates
within a <script type="text/x-jquery-tmpl"> tag, relying on the fact
that <script> tags with unfamiliar type attributes are ignored by the
browser but are still accessible through the DOM. This makes jQuery
templates very convenient to embed in HTML.

It's not a huge issue, obviously. The tags can be escaped, but the
resultant markup is pretty awful:

{% open templatevariable %}if foo{% close templatevariable %}
bar
{% open templatevariable %}/if{% close templatevariable %}

rather than

{{if foo}}
bar{
{/if}

I personally would love it if jQuery adopted different syntax, and who
knows, the dev team might be amenable to it. It wouldn't be a huge
change for them. Is it worth asking? What do you think?

-- Ori

References:
http://api.jquery.com/jquery.tmpl/
https://github.com/jquery/jquery-tmpl

Sean O'Connor

unread,
May 27, 2011, 1:04:40 AM5/27/11
to django-d...@googlegroups.com
I think it would be a bit much for us to ask the jQuery crew to change their template language to avoid conflict with ours.  Aside from the amount of backwards incompatible work we'd be asking them to do, they'd probably just end up with a new conflict with some other template language.  At the end of the day this is also more of a symptom than an underlying problem.  Even if we got the jQuery crew to change their syntax, there would still be other JS template languages with the same conflict (e.g. mustache.js).

A better approach would for Django to provide some tools and documentation to help people work around the conflict.  One easy solution would be to provide a verbatim tag like what ericflo wrote at https://gist.github.com/629508.  Another would be to provide documentation on tools that make it easy to load jquery style templates via ajax like icanhaz.js.

My vote is that we fix the problem once and for all on our end by providing compatibility tools and guidance instead of trying to tell the entire JS community to not conflict with out template syntax :)

-- 
Sean O'Connor
http://www.seanoc.com
--
You received this message because you are subscribed to the Google Groups "Django developers" group.
To post to this group, send email to django-d...@googlegroups.com.
To unsubscribe from this group, send email to django-develop...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/django-developers?hl=en.

Jonathan Slenders

unread,
May 27, 2011, 2:59:15 AM5/27/11
to Django developers
+1 for the verbatim tag. I think this is something that we need in
Django by default.

But I think that ericflo his implementation is not truly verbatim. I
mean, that it will probably drop whitespace between "{%" and the tag
names. It may not be important for jQuery, but if we implement
verbatim, the output should be an exact copy of the verbatim contents.

Further, because it is possible that other languages use the same {%
verbatim %} syntax, we should be able to configure what the end-tag
looks like. That way, we can nest {% verbatim %} tags.

For instance:
{% verbatim "===" %}
...
{% "===" %}

Cheers,
Jonathan


On 27 mai, 07:04, Sean O'Connor <s...@seanoc.com> wrote:
> I think it would be a bit much for us to ask the jQuery crew to change their template language to avoid conflict with ours. Aside from the amount of backwards incompatible work we'd be asking them to do, they'd probably just end up with a new conflict with some other template language. At the end of the day this is also more of a symptom than an underlying problem. Even if we got the jQuery crew to change their syntax, there would still be other JS template languages with the same conflict (e.g. mustache.js).
>
> A better approach would for Django to provide some tools and documentation to help people work around the conflict. One easy solution would be to provide a verbatim tag like what ericflo wrote athttps://gist.github.com/629508. Another would be to provide documentation on tools that make it easy to load jquery style templates via ajax like icanhaz.js.
>
> My vote is that we fix the problem once and for all on our end by providing compatibility tools and guidance instead of trying to tell the entire JS community to not conflict with out template syntax :)
>
> --
> Sean O'Connorhttp://www.seanoc.com
> > To post to this group, send email to django-d...@googlegroups.com (mailto:django-d...@googlegroups.com).
> > To unsubscribe from this group, send email to django-develop...@googlegroups.com (mailto:django-develop...@googlegroups.com).

Michael Blume

unread,
May 27, 2011, 3:07:38 AM5/27/11
to django-d...@googlegroups.com
Would it be possible to customize the markup Django uses for template compilation, either at the project level, at compile-time, or embedded in the template itself?

-Mike

To post to this group, send email to django-d...@googlegroups.com.
To unsubscribe from this group, send email to django-develop...@googlegroups.com.

Jonathan Slenders

unread,
May 27, 2011, 3:26:03 AM5/27/11
to Django developers
At project level is impossible, because you don't know for sure which
templates belong to which project. But it should be possible to define
the markup syntax for a directory of templates.

Embedded in the template is tricky, that's a chicken and egg problem.
The language should be known, before we are able to parse this kind of
meta information. We can also of course assume that we have the
current syntax at the beginning, and have a template_tag like the
following, which alters the lexer at that point.

{% template_syntax "[%" "]%" %}

But while it is possible and has it's uses, I'm really sure that there
are enough people against a dynamic syntax. It is too easy for the end-
users to screw this up, and abuse it...
I think a verbatim/raw/cdata -like tag is sufficient.


By the way, the syntax is defined in: django.template.base.
{BLOCK_TAG_START,BLOCK_TAG_END,...}

Eric Florenzano

unread,
May 27, 2011, 3:32:02 AM5/27/11
to Django developers
On May 26, 11:59 pm, Jonathan Slenders <jonathan.slend...@gmail.com>
wrote:
> +1 for the verbatim tag. I think this is something that we need in
> Django by default.
>
> But I think that ericflo his implementation is not truly verbatim. I
> mean, that it will probably drop whitespace between "{%" and the tag
> names. It may not be important for jQuery, but if we implement
> verbatim, the output should be an exact copy of the verbatim contents.

This is true. I couldn't find an easy way to implement a verbatim tag
that was truly "verbatim" at the time without making changes to
Django's internals.

-Eric

Gábor Farkas

unread,
May 27, 2011, 11:09:09 AM5/27/11
to django-d...@googlegroups.com
On Fri, May 27, 2011 at 7:04 AM, Sean O'Connor <se...@seanoc.com> wrote:
> A better approach would for Django to provide some tools and documentation
> to help people work around the conflict.  One easy solution would be to
> provide a verbatim tag like what ericflo wrote
> at https://gist.github.com/629508.  Another would be to provide
> documentation on tools that make it easy to load jquery style templates via
> ajax like icanhaz.js.

(technically, there is an open jquery-templating ticket about making
the template-tag format customizable:
https://github.com/jquery/jquery-tmpl/issues/74)

i had the same problem in the past (btw. mustache.js also uses the
two-curly-braces notation :-),
and unfortunately the verbatim tag did not solve the problem, because
sometimes you need
to use the django-templating INSIDE the jquery template
.
for example:
"""
.
.
<script type="text/x-jquery-tmpl">
Are you sure to delete {{ name_of_thing }}?
<button>{% trans "YES"%}</button>
<button>{% trans "NO"%}</button>
</script>
"""

here i want the {{ name_of_thing }} to be handled by
jquery-templating, but the translation
should happen using the django-tags.

so either i have to use the {% verbatim %} tag only around the places
where i have javascript-variables
(and not around the whole jquery-template), or i have to do the
translation in python,
and send them in as variables in javascript. both seem to be impractical.

the approach i chose was to use a different variable-syntax
(instead of "{{ thing }}", i use "[[ thing ]]"), and before using the template,
i simply replace those with the correct values. it's not nice, but
still the most practical solution i could find.

gabor

Sean Brant

unread,
May 27, 2011, 11:51:55 AM5/27/11
to django-d...@googlegroups.com
2011/5/27 Gábor Farkas <ga...@nekomancer.net>:

I wonder if verbatim as a filter makes more sense, for example::

<script type="text/x-jquery-tmpl">
Are you sure to delete {{ "{{ name_of_thing }}"|verbatim }}?


<button>{% trans "YES"%}</button>
<button>{% trans "NO"%}</button>
</script>

The filter would then just return {{ name_of_thing }} back to the
template. If you wanted to use a template variable as the name of the
jQuery variable this approach would still fail.

Now that I think about it maybe the replace tokens approach is the
most flexible.

{% verbatim "[[" "]]" %}


<script type="text/x-jquery-tmpl">
Are you sure to delete [[ name_of_thing ]]?
<button>{% trans "YES"%}</button>
<button>{% trans "NO"%}</button>
</script>

{% endverbatim %}

You you could then choose the tokens that get replaced.

- Sean

Tiago Boldt Sousa

unread,
May 28, 2011, 1:42:42 PM5/28/11
to Django developers
Hi,

I've using this in Django. I've just substituted {{ }} for [[ ]] in my
jquery templates and created a list of all the template ids I have.
Then, on document ready, I do:

for (var i in templates){
var newtext = $(templates[i]).text().replace(/\[\[/g,
"{{").replace(/\]\]/g, "}}");
$(templates[i]).text(newtext);
}

That replaces the [[ ]] for {{ }} again on the client side, removing
any conflict. Works perfectly :)
Reply all
Reply to author
Forward
0 new messages