Как обслуживаются активы формы Django (класс Media)?

На странице "Form Assets" в Django говорится

Django позволяет вам связывать различные файлы - например, таблицы стилей и скрипты - с формами и виджетами, которые требуют этих активов. Например, если вы хотите использовать календарь для отображения DateFields, вы можете определить пользовательский виджет Calendar. Затем этот виджет можно связать с CSS и JavaScript, необходимыми для отображения календаря. Когда виджет Calendar используется на форме, Django может определить CSS и JavaScript файлы, которые необходимы, и предоставить список имен файлов в форме, подходящей для включения на вашу веб-страницу.

.

Хорошо, но какой компонент Django берет эти активы формы и фактически помещает их на страницу?

Я спрашиваю, потому что пытаюсь использовать django-autocomplete-light (DAL) с django-bootstrap5 на форме с множественным выбором и полем "многие ко многим". Я сделал все установки, поместил виджет на поле формы:

class SomeForm(forms.ModelForm):
    class Meta:
        model = Something
        fields = ['things']
        widgets = {
            'things': autocomplete.ModelSelect2Multiple(
                url='myapp:things-autocomplete')
        }

Я знаю, что виджет url правильный, потому что если он неправильный, Django лает. Я знаю, что виджет помещается на поле, потому что оно меняется (от списка всего до пустого квадрата).

Я вижу, что HTML для виджета формы включает автозаполнение-лайт для мультивыбора "вещей" с автозаполнением "вещей":

...
<select name="things" class="form-select" required id="id_things"
 data-autocomplete-light-language="en"
 data-autocomplete-light-url="/things-autocomplete/"
 data-autocomplete-light-function="select2" multiple>
</select>
...

Однако я нигде не вижу, что select2.js включен в эту веб-страницу.

Я использовал django-autocomplete-light's ModelSelect2Multiple, в котором есть Select2WidgetMixin, определяющее свойство media со всеми видами красивых вещей:

        return forms.Media(
            js=(
                'admin/js/vendor/select2/select2.full.js',
                'autocomplete_light/autocomplete_light%s.js' % extra,
                'autocomplete_light/select2%s.js' % extra,
            ) + i18n_file,
            css={
                'screen': (
                    'admin/css/vendor/select2/select2%s.css' % extra,
                    'admin/css/autocomplete.css',
                    'autocomplete_light/select2.css',
                ),
            },
        )

Я не вижу ничего из этого красивого на своей веб-странице.

Я пока работаю в режиме debug=True (dev mode), поэтому считаю, что статические файлы должны обслуживаться при условии, что в моих настройках есть приложение django.contrib.staticfiles, что я и делаю.

Какой компонент Django должен обслуживать медиа DAL и как?

Я использую Django 4.1, django-autocomplete-light 3.9.4, django-bootstrap5 22.2.

P.S. Я видел другие вопросы, которые казались связанными, но не совсем с этой ситуацией.

EDIT: Похоже, что активы формы загружаются в шаблон с помощью {{form.media}}. Может быть, мне нужно поместить это средство в правильное место (HTML head)?

Я заставил это работать, добавив блок скрипта, и добавив jquery и медиа формы вручную:

{% block head_script %}
    <script type="text/javascript" src="{% static 'admin/js/vendor/jquery/jquery.js' %}"></script>
    {{form.media}}
{% endblock head_script %}

Не уверен, есть ли более автоматический способ включения медиа виджета.

Вернуться на верх