Как выводить тег шаблона Django {% static%} в объект JSON? - PullRequest
0 голосов
/ 13 февраля 2019

Моя цель - сериализовать вывод тега шаблона Django {% static 'my/file.png' %} из шаблонов HTML в объект JSON для ссылки в файле custom.js.Однако я получаю эту ошибку в консоли Chrome:

Uncaught SyntaxError: Unexpected token / in JSON at position 0
    at JSON.parse (<anonymous>)

Консольный отладчик показывает вывод тега {% static %}, который является ожидаемым значением абсолютного пути изображения: /static/img/my_image.png

Я понимаю, что может быть проблема с выходом из тега {% static %} - и это вызывает явную синтаксическую ошибку, отображаемую в консоли Chrome.

Я говорю это потому, что понимаю, что строкаанализ не действителен для целей используемого метода, JSON.parse().

То есть метод JSON.parse(), на который ссылается приведенный ниже код, принимает аргумент, и этот аргумент является выходом тега {% static %} в этом случае - и этот аргумент не является допустимым вводом для JSONнасколько я понимаю, метод.

Исходя из этого, моя интуиция подсказывает мне, что, возможно, вывод тега {% static %} можно экранировать - и что это измененное значение можно эффективно использовать с методом JSON.parse().

Мой текущий код опирается на решение, описанное в этом документе Quora и Django:

https://www.quora.com/How-does-one-access-Django-template-variables-in-JavaScript

https://docs.djangoproject.com/en/2.2/ref/templates/builtins/#escapejs

Я рассмотрел несколько стековых потоковответы, но не нашел того, который, как я понял, достаточно уместен для справки.

Мой код index.html, сокращенный для краткости, выглядит следующим образом:

...

<body data-spy="scroll" data-target="#navbarResponsive" data-js-vars="{% static 'img/my_image.png'|escapejs %}">

<script type="text/javascript">
    var static_vars = JSON.parse(document.getElementsByTagName('body')[0].getAttribute('data-js-vars'));
</script>

Я также пыталсяс использованием фильтра тегов шаблонов Django | json_script: «myIdname» на основе ранее упомянутого ресурса Django Docs - и без фильтра шаблонов Django, т. е. {% static 'img / my_image.png'%}

...

<body data-spy="scroll" data-target="#navbarResponsive" data-js-vars="{% static 'img/my_image.png'|escapejs %}">

<script id="json-vars" type="text/javascript">
    var static_vars = JSON.parse(document.getElementsById('json-vars')[0].textContent);
</script>

ThЭта попытка отображает ошибку в консоли Chrome:

VM6347 extensions::schemaUtils:115 Uncaught Error: Invocation of form runtime.connect(null, ) doesn't match definition runtime.connect(optional string extensionId, optional object connectInfo)
    at Object.normalizeArgumentsAndValidate (VM6347 extensions::schemaUtils:115)
    at Object.<anonymous> (VM6342 extensions::binding:363)
    at Object.<anonymous> (VM6341 extensions::runtime:56)
    at Object.handleRequest (VM6342 extensions::binding:64)
    at Object.<anonymous> (VM6342 extensions::binding:374)
    at notify (content.js:14336)
    at parse (content.js:14344)
normalizeArgumentsAndValidate   @   VM6347 extensions::schemaUtils:115
(anonymous) @   VM6342 extensions::binding:363
(anonymous) @   VM6341 extensions::runtime:56
(anonymous) @   VM6342 extensions::binding:64
(anonymous) @   VM6342 extensions::binding:374
notify  @   content.js:14336
parse   @   content.js:14344

Вызов static_vars (предполагаемое имя объекта JSON из кода, указанного ранее) в консоли Chrome возвращает undefined для обеих попыток.

Используя Chrome Console, выходные данные следующих команд соответствуют ожидаемым:

document.getElementsByTagName('body')[0].getAttribute('data-js-vars')

С выходом ...

"/static/img/my_image.png"

Однако, используя этот код с методом JSON.parse (), т.е. ..

var static_vars = JSON.parse (document.getElementsByTagName ('body') [0] .getAttribute ('data-js-vars'));

... возвращает первую ошибку, описанную выше.

Я могу передать переменные js в custom.js, используя следующее:

<script type="text/javascript">
    var darkimg = "{% static 'img/mydarkimg.png' %}";
    var lightimg = "{% static 'img/mylightimg.png' %}";
</script>

Но я нахожу это сколь угодно грязным, и, таким образом, мое стремление к цели, изложенной в начале этого поста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...