Мне не очень нравится ваше решение, нет необходимости создавать дополнительный элемент html для передачи переменной django и чтения ее из JS.Это подвержено ошибкам и добавляет ненужные HTML-элементы в вашу DOM.
Вместо этого я рекомендую два решения:
Решение 1
Используйте сценарий JS в своем шаблоне, где вы будете выгружать переменные JS, а затем использоватьих прямо из ваших файлов JS.Чтобы сделать это, у меня обычно будет скрипт внутри моего шаблона до моего пользовательского кода JS, где я определяю глобальный объект JS, содержащий все переменные Django, например:
<script>
var g_django = {
url1: '{% url "the_first_url" %}',
url2: '{% url "the_second_url" %}',
image: '{% static "images/an_image" %}'
}
</script>
<script src='{% static "js/ajax.js" %}'></script>
ТеперьЯ могу использовать g_django.url1
, g_django.image
и т. Д. Внутри скрипта js/ajax.js
.Это можно использовать, если у вас мало вещей, которыми вы должны делиться между django и JS.
Solution 2
Если у вас есть больше вещей, которыми вы должны поделитьсямежду Django и js, и вы хотите иметь лучший контроль, вы можете создать шаблон JS-Django, т.е. создать обычный файл JS внутри вашей папки шаблонов.Затем этот файл может быть либо включен в тег <script>
(см. Мой ответ здесь, чтобы найти аналогичное решение с помощью css: Django Использовать URL-адрес статических файлов в статических файлах ), либо еще лучше использовать его как обычный djangoпросмотр через TemplateView
.Таким образом, вы создадите файл с именем django_data.js
в папке templates
, в который вы напишите код JS, смешанный с переменными django, например, его содержимое может быть примерно таким:
var g_django = {
url1: '{% url "the_first_url" %}',
url2: '{% url "the_second_url" %}',
image: '{% static "images/an_image" %}'
}
Этот файлЗатем нужно будет включить его в ваш urls.py через TemplateView примерно так:
class django.views.generic.base.TemplateView
urlpatterns = [
path('django_data_js/', TemplateView.as_view(template='django_data.js', content_type='application/javascript'), name='django_data_js' ),
]
Теперь вы можете посетить django_data_js /, чтобы взглянуть на ваши переменные JS и убедиться, что все отображается правильно иКонечно, вы можете включить его (как шаблон) в свои сценарии, например так:
<script src='{% url "django_data_js" %}'></script>
<script src='{% static "js/ajax.js" %}'></script>
Обратите внимание на разницу между включением template-js (с использованием url
) и включением обычного статического файла (с использованием * 1041)*).После этого вы сможете использовать g_django
изнутри вашего js/ajax.js
.