Как включить многострочный HTML из шаблона django в переменную javascript - PullRequest
12 голосов
/ 03 апреля 2011

Из шаблона Django я хотел бы включить html-фрагмент из файла, скажем, mysnippet.html:

<div>
    blah
</div>

в переменную javascript:

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

Проблема в том, что новые строки нужно будет экранировать. В противном случае, Javascript жалуется на «неопределенный строковый литерал».

Я знаю, что косые черты можно добавить с помощью {{x|addslashes}}, но я не знаю, как это сделать для тега {% include %}.

Ответы [ 3 ]

19 голосов
/ 03 апреля 2011

вы пробовали filter тег шаблона?

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

Лучше избежать всех специальных символов, используя escapejs filter:

{% filter escapejs %}{% include 'mysnippet.html' %}{% endfilter %}
2 голосов
/ 03 апреля 2011

Следуя совету Ежика (спасибо!), Я использовал

{% 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 есть инструкции по настраиваемым шаблонам .

1 голос
/ 03 апреля 2011

Я заметил, что вы используете 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, в этом случае новые строки не нужно экранировать.

...