Почему я не могу использовать Jinja в Javascript для сайта django?

Итак, для тех из нас, кто использует Python и Django framework для разработки веб-сайтов, есть этот замечательный инструмент, известный как jinja, который можно использовать в качестве механизма шаблонов. Например:

Вместо того, чтобы жестко кодировать импорт, подобный этому:

<script src = "assets/js/onebutton.js"></script>

Мы можем сделать это:

<script src = "{% static 'assets/js/onebutton.js' %}"></script>

В этом случае он автоматически ищет папку с именем static и заходит внутрь, чтобы найти необходимый код.

Но почему нельзя использовать шаблон jinja в Javascript?

Например:

homepage.html

<script src='whatever.js'></script>
<p>Another example</p>
<button id = "clickme"> click me </button>

what.js

$(function()
{
$('#clickme').click(function(){
$.ajax({
                    headers : {'X-CSRFToken': getCookie('csrftoken')},
                    type: "POST",
                    url: '{% url "func" %}', //<--Problem arise here
                    datatype:"json",
                    data: {},
                    success: function(data){
                        var new_template = '<h1> %firstmsg% </h1>';
                        var new_frontend = new_template.replace('%firstmsg%',data.message);
                        console.info(new_frontend);
                        document.getElementById('wor').innerHTML+=new_frontend;
                    }
                });
}
}

Django распознает URL-адрес в запросе AJAX как /'{% url "func" %}' вместо /func.

Единственный способ решить эту проблему - переместить весь код из whatever.js в homepage.html в блоке <script></script>.

Возможно, нам нужно что-то импортировать, чтобы шаблон Jinja работал?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
2 481
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий
<script src = "{% static 'assets/js/onebutton.js' %}"></script>

In this case, it automatically searches for a folder named static and goes inside to look for the needed code.

Это неточно. Все, что он делает, это конвертирует указанный путь в статический путь, указанный в вашем файле настроек, например, /static/asssets/js/onebutton.js. Вот и все. Django или Jinja2 не просматривают папку и не ищут файл. Его даже не волнует, существует файл или нет.

Позже браузер автоматически загружает этот файл с сервера, когда получает html-документ.


Возвращаясь к исходным вопросам о том, почему вы не можете использовать синтаксис шаблонов Jinja2 или Django в своих файлах JS. Что ж, можешь. Но вам нужно будет отображать ваши JS-файлы из ваших представлений.

Теперь я уверен, что вы используете функцию render для возврата шаблона из ваших представлений. Но что он делает?

Функция render преобразует специфичные для django теги шаблона в надлежащий HTML-контент.

Итак, если вы используете синтаксис шаблонов django или jinja в своих файлах js, вам также придется визуализировать ваши файлы js. Но это кажется плохой идеей. Вместо этого вы можете создать некоторые глобальные переменные в своих html-файлах и использовать их в своих js-файлах.

<!-- define required variables in template -->
<script>
    var URL = '{% url ... %}';
    var OTHER_VARIABLE = '{{ other_variable }}';
</script>
<!-- include your js files -->
<script src = "/path/to/file.js"></script>

У меня есть обходной путь для такого рода необходимости. Поместите ваш код js в тег <script></script> и сохраните его как файл html в папке шаблонов.

Теперь вы можете добавить файл html на свою страницу.

{% include 'myapp/js_code_with_jinja.html' %}

Весь код jinja будет работать должным образом.

Другие вопросы по теме