2011-04-03 73 views
12

從Django的模板,我想包括從文件的HTML片段,說mysnippet.html如何包括從Django的模板多行HTML到JavaScript變量

<div> 
    blah 
</div> 

成JavaScript變量:

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

問題是新行需要被轉義。否則,Javascript抱怨「未終止的字符串文字」。

我知道斜槓可以加上{{x|addslashes}},但我不知道如何做{% include %}標籤。

回答

16

你試過filter template tag?所有特殊字符

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

更好的逃生是使用escapejs過濾:

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

謝謝,幫助。我寫了一個單獨的答案,我最終如何修復它。 – gozzilli 2011-04-03 10:29:42

+0

@gozzilli和'escapejs'內置過濾器不適合你? http://docs.djangoproject.com/en/1.3/ref/templates/builtins/#escapejs – Jerzyk 2011-04-03 11:31:10

+0

哎唷!是的,它確實有用,對不起我應該有RTFM。 :(唯一的區別是,這看起來有點可怕的HTML源代碼,因爲它全部打印在一行上,但你仍然是正確的,escapejs正是我所需要的... – gozzilli 2011-04-03 13:29:19

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,在這種情況下,新行不需要轉義。

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