Как обслуживаются активы формы 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 %}
Не уверен, есть ли более автоматический способ включения медиа виджета.