Как передать массив в Django в шаблон и использовать его с JavaScript

Я хочу передать массив в шаблон, а затем использовать его через JavaScript.

В моем views.py у меня есть:

arry1 = ['Str',500,20]
return render_to_response('test.html', {'array1': arry1})

И в моем шаблоне:

var array1 = {{ array1 }};

но когда я захожу на сайт, он выводит:

var array1 = ['Str',500,20];

Что мне нужно изменить?


person Christian    schedule 11.04.2009    source источник
comment
Пожалуйста, будьте более конкретными. Как это явно нарушает ваш код? JavaScript кажется мне действительным.   -  person Deniz Dogan    schedule 11.04.2009
comment
Когда я впервые опубликовал вопрос, переформатированный stackoverflow ' без пробелов до ' . Я думаю, что это должно работать, как задумано в JavaScript (или, по крайней мере, я предполагаю, что это работает именно так. Но почему-то появляется & # 3 9 ; (опять же без пробелов)   -  person Christian    schedule 11.04.2009


Ответы (5)


Попробуйте использовать {{ array1|safe }} и посмотрите, есть ли разница. Я не проверял это, поэтому надеюсь, что меня не заминусуют, если это неверно...

person Deniz Dogan    schedule 11.04.2009
comment
особенно полезно для меня (и других?) Переход с App Engine Django версии 0.96 на версию 1.2: в версии 1.2 вы ДОЛЖНЫ использовать безопасный фильтр, тогда как в версии 0.96 он просто работал... - person DanDan; 26.10.2011
comment
Что произойдет, если один из элементов в array1 является объектом datetime. JavaScript не распознает дату и время. Например, если array1 = ['str', 500, 20, datetime.datetime(2017, 8, 23, 0, 0)] - person nishant; 05.01.2018

Как уже упоминалось, вы можете использовать фильтр |safe, чтобы Django не очищал массив и оставлял его как есть.

Другой вариант, и, вероятно, лучший в долгосрочной перспективе — использовать модуль simplejson (он включен в django) для форматирования вашего списка Python в объект JSON, в котором вы можете вернуться к Javascript. Вы можете перебирать объект JSON так же, как и любой массив.

from django.utils import simplejson
list = [1,2,3,'String1']
json_list = simplejson.dumps(list)
render_to_response(template_name, {'json_list': json_list})

А в вашем Javascript просто {{ json_list }}

person Bartek    schedule 11.04.2009
comment
json_list становится [1, 2, 3, &q u o t;String1&q u o t;] (я добавил пробелы после &, q, u, o, t, чтобы предотвратить переформатирование вывода stackoverflow). Это также не работает. - person Christian; 11.04.2009
comment
Может быть, лучше всего использовать simplejson.dumps, а затем безопасный фильтр? - person Christian; 11.04.2009
comment
Вы правы, в этом случае вам все равно нужно использовать |safe. Обычно, когда я делаю JSON с Django, я извлекаю его, используя метод AJAX (например, $.getJSON из jQuery), поэтому мне никогда не приходится использовать |safe. - person Bartek; 11.04.2009
comment
simplejson.dumps удалены, поскольку django 1.5 использует json.dumps stackoverflow.com/questions/28048943/ - person amchugh89; 29.10.2015

В Джанго:

from django.utils import simplejson
json_list = simplejson.dumps(YOUR_LIST)

И ПЕРЕДАТЬ "json_list" В КОНТЕКСТЕ

В JS:

var YOUR_JS_LIST = {{YOUR_LIST|safe}}; 
person Tulio Nobrega    schedule 25.01.2013
comment
Похоже, что simplejson больше не доступен после Django 1.5. Вместо этого используйте json Python (import json) - person Anupam; 14.09.2017

Просто попробуйте заменить var array1 = {{ array1 }}; на var array1 = '{{ array1|safe }}'; . Я не знаю почему, но это сработало для меня. введите здесь описание изображения

person Sanat Jha    schedule 02.06.2021

Это можно сделать с помощью сериализаторов ядра django. Все, что вам нужно сделать, это сериализовать ваши данные в json, а затем передать их в шаблон.

data = serializers.serialize("json", <list>)
return render(request, 'view.html', {'data':data})

В своем шаблоне сохраните этот список в переменную javascript.

var list = {{data|safe}}
person muak    schedule 20.05.2016