Django和Mustache在模板中使用相同的语法。

24

我尝试将HTML模板藏在mustache.js的HTML中,但是django模板引擎会移除所有应该原样输出到前端的占位符。

模板是以以下方式包含在HTML中:

<script type="text/x-mustache-template" data-id="header_user_info">
    <div id="header_user_info">
        <div id="notification">0</div>
        <a href="#">{{username}}</a>
    </div>
</script>

我可以通过运行$(el).html()获取HTML模板,并使用Mustache.to_html(temp, data)生成HTML。

我可以将所有模板放入另一个静态文件中并从CDN提供,但这样就很难追踪模板所属的位置,并且至少需要一个额外的HTTP请求。


@Alasdair 请看我的答案,这是更好的方法。templatetag 的解决方案太啰嗦了。 - surj
你可以在项目中使用verbatim标签。查看此链接:https://code.djangoproject.com/ticket/16318 - Fernando Valente
7个回答

49

你可以简单地更改标签:

Mustache.tags = ['[[', ']]'];

将Mustache标签更改以处理Django问题?并不理想。过去没有太多选择,但是Django 1.5现在支持verbatim标签。请参见下面@cat的答案。 - mynameistechno
2
为什么verbatim标记更好? - surj
刚刚使用了这种方法来避免Mustache和Liquid模板的冲突。对我来说,这是最简单和最清洁的解决方案。 - Andy Copley
1
我应该把这放在哪里? - cafebabe1991
@cafebabe1991 你需要在Mustache脚本加载后立即执行此操作。因此,如果您正在使用jQuery,则应该能够在文件底部/顶部执行<script>$(function() { Mustache.tags = ...; })</script> - surj

24

1
好的。那就接受我的答案吧。你可能也应该接受你之前提出的其他问题的答案。 - Chris Pratt
不错!我之前不知道这个标签。 - Yuji 'Tomita' Tomita
7
虽然这么做可以起作用,但肯定有比用 {% templatetag openvariable %} 替换每个 {{ 的更好的方法。 - Michael Mior
1
有一个很好的Gist可以将文本包含在Django模板中而不解析它:https://gist.github.com/629508。它允许您在{% verbatim %} {{unrendered}} {% endverbatim %}中包装部分。 - Darb
1
请查看下面我的答案,这是一个更好的方法。 - surj
新的verbatim标签是正确的选择。 - mynameistechno

22

如果您使用的是 Django 1.5 或更新版本,请使用以下命令:

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

如果你在AppEngine上被卡在Django 1.2版本,请使用verbatim模板命令扩展Django语法,像这样...

from django import template

register = template.Library()

class VerbatimNode(template.Node):

    def __init__(self, text):
        self.text = text

    def render(self, context):
        return self.text

@register.tag
def verbatim(parser, token):
    text = []
    while 1:
        token = parser.tokens.pop(0)
        if token.contents == 'endverbatim':
            break
        if token.token_type == template.TOKEN_VAR:
            text.append('{{')
        elif token.token_type == template.TOKEN_BLOCK:
            text.append('{%')
        text.append(token.contents)
        if token.token_type == template.TOKEN_VAR:
            text.append('}}')
        elif token.token_type == template.TOKEN_BLOCK:
            text.append('%}')
    return VerbatimNode(''.join(text))

在你的文件中(Python 2.7,HDR),使用:

from django.template import Context, Template
import django
django.template.add_to_builtins('utilities.verbatim_template_tag')

html = Template(blob).render(Context(kwdict))

如果您在文件中(Python 2.5)使用:

from google.appengine.ext.webapp import template
template.register_template_library('utilities.verbatim_template_tag')

Source: http://bamboobig.blogspot.co.at/2011/09/notebook-using-jquery-templates-in.html


6

尝试使用django-mustachejs

{% load mustachejs %}
{% mustachejs "main" %}

Django-mustachejs 将生成以下内容:
<script>Mustache.TEMPLATES=Mustache.TEMPLATES||{};Mustache.TEMPLATES['main']='<<Your template >>';</script>

2
我遇到了同样的问题,但是使用了相同的解决方案。
{% templatetag openvariable %} variable {% templatetag closevariable %}

对我来说太冗长了。我只是添加了一个非常简单的自定义模板标签:

@register.simple_tag
def mtag(tagContent):
    return "{{%s}}" % tagContent

现在我可以写出以下代码:
{% mtag "variable" %}

2
你可以使用内置的mustache.js设置定界符标签来更改mustache默认使用的标签。
例如:
{{=<% %>=}}

现在您可以做到这一点:
<% variable %>

1

我有同样的问题,所以大多数时候我的变量是可翻译的字符串的一部分。

{% trans "The ball is {{ color }}" %}

即使您不提供i18n,也可以使用trans模板标签。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接