如何将django模板中的多行html包含到javascript变量中

时间:2011-04-03 00:07:08

标签: django django-templates addslashes

从Django模板中,我想在文件中加入一个html片段,比如mysnippet.html

<div>
    blah
</div>

进入javascript变量:

<script type="text/javascript">
     var myvar = {% include 'mysnippet.html' %}
</script>

问题是新线路需要转义。否则,Javascript会抱怨“未终止的字符串文字”。

我知道可以使用{{x|addslashes}}添加斜杠,但我不知道如何为{% include %}标记添加斜杠。

3 个答案:

答案 0 :(得分:19)

您是否尝试过filter模板标记?

{% filter addslashes %}{% include 'mysnippet.html' %}{% endfilter %}

更好地逃避所有特殊字符是使用escapejs过滤器:

{% filter escapejs %}{% include 'mysnippet.html' %}{% endfilter %}

答案 1 :(得分:2)

遵循Jerzyk的建议(谢谢!),我已经使用了

{% filter addslashes %}{% include 'mysnippet.html' %}{% endfilter %}

不幸的是,我意识到它并没有像我想的那样逃避新行,而是引用了。所以我定义了一个新的过滤器:

def escapenewline(value):
    """
    Adds a slash before any newline. Useful for loading a multi-line html chunk
    into a Javascript variable.
    """
    return value.replace('\n', '\\\n')
escapenewline.is_safe = True
escapenewline = stringfilter(escapenewline)

register.filter('escapenewline', escapenewline)

并使用它而不是addslashes:

{% filter escapenewline %}{% include 'mysnippet.html' %}{% endfilter %}

在Django文档上,custom templates上有一个操作方法。

答案 2 :(得分:1)

我注意到你使用的是javascript。如果您不介意使用jQuery和一些AJAX,可以使用另一种方法将html分配给javascript变量。

创建一个视图以显示您的代码段:

# views.py
def mysnippet(request):
    return render(
        request,
        'yourapp/mysnippet.html',
    )

# urls.py
urlpatterns = patterns('yourapp.views',
    url(r'mysnippet/$', 'mysnippet', name='mysnippet'),
)

您可以将以下内容放入模板中,或将javascript分隔在自己的文件中:

<script type="text/javascript">
$(document).ready(function() {
    $.get("/yourapp/mysnippet/", function(data) {
        var myvar = data;
    });
});
</script>

myvar现在应该包含html,在这种情况下新行不需要转义。