Django 的表单资产(媒体类)是如何服务的?



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媒体。

最新更新