从Django模板中,我想在文件中加入一个html片段,比如mysnippet.html
:
<div>
blah
</div>
进入javascript变量:
<script type="text/javascript">
var myvar = {% include 'mysnippet.html' %}
</script>
问题是新线路需要转义。否则,Javascript会抱怨“未终止的字符串文字”。
我知道可以使用{{x|addslashes}}
添加斜杠,但我不知道如何为{% include %}
标记添加斜杠。
答案 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,在这种情况下新行不需要转义。