我想使用AngularJS与Django,但他们都使用{{}}作为他们的模板标签。是否有一种简单的方法来更改其中之一,以使用其他自定义模板标签?


当前回答

你总是可以使用ng-bind而不是{{}} http://docs.angularjs.org/api/ng/directive/ngBind

<span ng-bind="name"></span>

其他回答

你总是可以使用ng-bind而不是{{}} http://docs.angularjs.org/api/ng/directive/ngBind

<span ng-bind="name"></span>

你可以使用{% templatetag %}标签告诉Django输出{{和}},以及其他保留的模板字符串。

例如,使用{% templatetag openvariable %}将输出{{。

如果执行任何服务器端插值,唯一正确的方法是使用<>

$interpolateProvider.startSymbol('<{').endSymbol('}>');

其他任何向量都是XSS向量。

这是因为任何没有被Django转义的Angular分隔符都可以被用户输入到插入的字符串中;如果有人将他们的用户名设置为“{{evil_code}}”,Angular会很乐意运行它。但是,如果您使用的字符没有被Django转义,则不会发生这种情况。

我发现下面的代码很有用。我在这里找到了代码:http://djangosnippets.org/snippets/2787/

"""
filename: angularjs.py

Usage:
    {% ng Some.angular.scope.content %}

e.g.
    {% load angularjs %}
    <div ng-init="yourName = 'foobar'">
        <p>{% ng yourName %}</p>
    </div>
"""

from django import template

register = template.Library()

class AngularJS(template.Node):
    def __init__(self, bits):
        self.ng = bits

    def render(self, ctx):
        return "{{%s}}" % " ".join(self.ng[1:])

def do_angular(parser, token):
    bits = token.split_contents()
    return AngularJS(bits)

register.tag('ng', do_angular)

所以今天我在Angular IRC频道得到了很大的帮助。事实证明,你可以很容易地更改Angular的模板标签。以下必要的代码片段应该包含在你的angular include之后(给定的例子会出现在他们的邮件列表中,并且会使用(())作为新的模板标签,代替你自己的):

angular.markup('(())', function(text, textNode, parentElement){
  if (parentElement[0].nodeName.toLowerCase() == 'script') return;
  text = text.replace(/\(\(/g,'{{').replace(/\)\)/g, '}}');
  textNode.text(text);
  return angular.markup('{{}}').call(this, text, textNode, parentElement);
});

angular.attrMarkup('(())', function(value, name, element){
    value = value.replace(/\(\(/g,'{{').replace(/\)\)/, '}}');
    element[0].setAttribute(name, value);
    return angular.attrMarkup('{{}}').call(this, value, name, element);
});

此外,我还指出了即将进行的增强,它将公开startSymbol和endSymbol属性,可以将它们设置为您想要的任何标记。