Подтвердить что ты не робот

Как включить многострочный html из шаблона django в переменную javascript

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

<div>
    blah
</div>

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

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

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

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

4b9b3361

Ответ 1

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

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

лучший выход всех специальных символов - использовать фильтр escapejs:

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

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

Ответ 3

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