Django template JS variable 'safe' method не передает данные в пользовательский js файл?
Я пытаюсь передать ключ google api в мой пользовательский js файл в Django, функция предназначена для автозаполнения поиска google places api, но на данный момент она не работает, если я помещаю фактический ключ непосредственно в функцию .getScript, например:
https://maps.googleapis.com/maps/api/js?key=XXX&libraries=places"
тогда функция поиска работает, но с текущей настройкой, также предназначенной для скрытия ключа api, она не работает, я явно что-то упускаю, оцените любые идеи?
настройки джанго:
GOOGLE_API_KEY = "XXX"
base.html
<script src="{% static 'js/google_places.js' %}"></script>
views.py
{'google_api_key': settings.GOOGLE_API_KEY}
google_places.js
$.getScript("https://maps.googleapis.com/maps/api/js?key=" + google_api_key + "&libraries=places")
.done(function( script, textStatus ) {
google.maps.event.addDomListener(window, "load", initAutoComplete)
})
let autocomplete;
function initAutoComplete(){
autocomplete = new google.maps.places.Autocomplete(
document.getElementById('autocomplete'),
{
types: ['country', 'locality'],
})
}
travel.html
<input id='autocomplete' placeholder='enter a place' type="text">
{% endblock content %}
{% block js %}
<script type="text/javascript">
var google_api_key = "{{google_api_key|safe}}";
</script>
{% endblock js %}
также переменная google_api_key передается в travel.html, я проверил это и все работает нормально.
Попробуйте использовать тег json_script, как описано в документации Django https://docs.djangoproject.com/en/4.0/ref/templates/builtins/
в вашем шаблоне:
{{ google_api_key|json_script:"google_api_key" }}
затем в js перед тем, как вы хотите использовать google_api_key:
const google_api_key = JSON.parse(document.getElementById("google_api_key").textContent);
Я выяснил проблему, которая у меня была, мне нужно было поместить функцию готовности документа в мой пользовательский js файл, так что в итоге я выбрал метод json_script и вот что у меня получилось:
travel.html (вставляется в html часть шаблона над содержимым endblock)
{{ google_api_key|json_script:"google_api_key" }}
google_places.js
$( document ).ready(function() {
// const google_api_key = document.getElementById('google_api_key');
const google_api_key = JSON.parse(document.getElementById("google_api_key").textContent);
$.getScript("https://maps.googleapis.com/maps/api/js?key=" + google_api_key + "&libraries=places")
.done(function( script, textStatus ) {
google.maps.event.addDomListener(window, "load", initAutoComplete)
})
let autocomplete;
function initAutoComplete(){
autocomplete = new google.maps.places.Autocomplete(
document.getElementById('autocomplete'),
{
types: ['country', 'locality'],
})
}
});