13

从 Django 模板中,我想从文件中包含一个 html 片段,比如mysnippet.html

<div>
    blah
</div>

进入一个javascript变量:

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

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

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

4

3 回答 3

21

你试过filter模板标签吗?

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

所有特殊字符的更好转义是使用escapejs过滤器:

{% filter escapejs %}{% include 'mysnippet.html' %}{% endfilter %}
于 2011-04-03T00:43:11.103 回答
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)

并用它代替了addlashes:

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

在 Django 文档中有一个关于自定义模板的操作方法。

于 2011-04-03T10:28:39.350 回答
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,在这种情况下不需要转义新行。

于 2011-04-03T02:36:15.963 回答