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包括自动完成轻的东西,以多选"东西"与"things"自动完成:
...
<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的ModelSelect2Multiple
,它有Select2WidgetMixin
定义了一个媒体属性与各种好看的东西:
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
(开发模式),所以我相信只要我在我的设置中有django.contrib.staticfiles
应用程序,就应该提供静态文件。
哪个Django组件应该提供DAL的媒体,如何提供?
我使用的是Django 4.1, Django -autocomplete-light 3.9.4, Django -bootstrap5 22.2.
注:我看到了其他似乎相关的问题,但不完全是这种情况。
编辑:它看起来像表单资产加载在一个模板与{{form.media}}
。也许我必须把媒体放在正确的地方(HTML头)?
我通过添加脚本块,手动添加jquery和表单媒体来实现这一点:
{% block head_script %}
<script type="text/javascript" src="{% static 'admin/js/vendor/jquery/jquery.js' %}"></script>
{{form.media}}
{% endblock head_script %}
不确定是否有更自动的方式来包含widget媒体。