Проблема включения внешнего jQuery в шаблон Django

#python #jquery #django

Вопрос:

Приведенный ниже шаблон не вызывает проблем, если я запускаю его в том же html-шаблоне. Но если я помещу код jQuery в country_dropdown.js внешний файл внутри статической папки, и я включаю его вот так:

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

затем следует следующее:

 url: "{% url 'get-province' %}",
 

не получится.

Похоже, что теги {% не распознаются внутри внешних файлов js, даже если они должны быть распознаны. На самом деле запрошенное отображается таким образом:

 Request URL:    http://127.0.0.1:8000/countries/{% url 'get-province' %}
 

Очевидно, что { означает {, а % означает %. Поэтому теги шаблона неправильно распознаются вне шаблона.

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

Как я мог бы включить внешний jQuery без проблем? Я включил полный шаблон здесь.

 {% extends 'base.html' %}
{% load i18n %}
{% load static %}
{% block content %}
    <form class="" action="" method="post">
        {% csrf_token %}
        {% for error in errors %}
            <div class="alert alert-danger mb-4" role="alert">
                <b>{{ error }}</b>
            </div>
        {% endfor %}
        current {{ lang }}
        <div class ="row">
            <div class="col-lg-6">
                <div class="mb-4">
                    {{ form.country }}
                </div>
            </div>
            
        </div>
        <div class="row">
            <br><br>
            <div class="col-lg-6">
                <div class="mb-4">
                    <div class="form-group">
                        <label>{% trans "Select a Province/State" %}</label>
                        <select id="id_province" class="form-control" name="state">
                            <option value="----">{% trans "Select Province/State" %}</option>
                        </select>
                    </div>
                </div>
            </div>
        </div>
    </form>

    <script src="https://code.jquery.com/jquery-3.3.1.min.js"></script>
    <!--<script  src="{% static 'js/countries.js' %}"></script>-->
    <script>
        $("#id_country").change(function(){
            var countryId = $(this).val();
            /* if country changes reset city list */
            //$("#id_city").html("");

            $.ajax({
                type: "POST",
                url: "{% url 'get-province' %}",
                data: {
                    'csrfmiddlewaretoken': '{{ csrf_token }}',
                    'country': countryId
                },
                success: function (data){
                    console.log(data.provinces);
                    data.provinces = data.provinces.sort(function(a, b){
                        if (a[1] < b[1]) return -1;
                        if (a[1] > b[1]) return 1;
                        return 0;
                    });
                    let html_data = '';
                    if (data.provinces.length !== 0) {
                        html_data = '<option value="-----">{% trans "Select State" %}</option>';
                        data.provinces.forEach(function(data){
                        html_data  = `<option value="${data[0]}">${data[1]}</option>`
                    });
                    }else{
                        html_data = '<option value="-----">{% trans "No states available for this country" %}</option>';
                    }
                    $("#id_province").html(html_data);
                }
            });
        });
    </script>
{% endblock %}
 

Комментарии:

1. Почему бы тебе не переехать $("#id_country").change(function() в base.html ? Таким образом, у вас будет доступ к нему из каждого шаблона, который вы расширяете base.html

2. Я мог бы это сделать, но большинству шаблонов это не понадобится. И было бы нецелесообразно иметь код jQuery, доступный для ВСЕХ шаблонов, когда он необходим только в шаблонах с формой, включающей раскрывающиеся списки стран.

3. В этом случае вы можете создать шаблон (например base_with_jquery.html) и унаследовать от base.html. Наконец, унаследуйте от base_with_jquery.html вместо base.html где вам нужна эта функция.

4. Да, я могу сделать это идеально. Но это означает, что невозможно загрузить код jQuery извне. Я подозреваю, что это возможно только с помощью ванильного JavaScript

5. Нет, это не сработает. Потому что в base.html Я должен объявить блок содержимого, чтобы включить его. В base_with_jquery.js Я также должен включить блок содержимого, но он будет дублироваться. Если у меня есть {% содержимого блока%}, а затем {% jquery блока %} в базе, то это то же самое, что поместить весь jQuery в базу. Он будет загружен во все шаблоны. Это должен быть другой способ решить эту проблему.