从文档:
资产插入 DOM 的顺序通常很重要。例如,您可能有一个依赖于 jQuery 的脚本。因此,组合 Media 对象会尝试保持资产在每个 Media 类中定义的相对顺序。
考虑这个例子:
class FooWidget(forms.TextInput):
class Media:
js = ('foo.js',)
class BarWidget(forms.TextInput):
class Media:
js = ('bar.js',)
class SomeForm(forms.Form):
field1 = forms.CharField(widget=BarWidget)
field2 = forms.CharField(widget=FooWidget)
def __init__(self, *args, **kwargs):
super(SearchForm, self).__init__(*args, **kwargs)
现在,当您调用 时form.media
,脚本将呈现如下:
<script type="text/javascript" src="/static/bar.js"></script>
<script type="text/javascript" src="/static/foo.js"></script>
为什么bar.js
要先渲染foo.js
?因为 django 是根据表单中调用它们的顺序来呈现它们的,而不是定义类的顺序。如果要更改此示例中的顺序,只需交换 positionfield1
和field2
in SomeForm
。
这对 jQuery 有什么帮助?您可以通过自定义小部件呈现您的 jQuery CDN 脚本:
class FooWidget(forms.TextInput):
class Media:
js = ('https://code.jquery.com/jquery-3.4.1.js', 'foo.js',)
class BarWidget(forms.TextInput):
class Media:
js = ('https://code.jquery.com/jquery-3.4.1.js', 'bar.js',)
现在你的form.media
将看起来像这样:
<script src="https://code.jquery.com/jquery-3.4.1.js"></script>
<script type="text/javascript" src="/static/bar.js"></script>
<script type="text/javascript" src="/static/foo.js"></script>
注意/static/
没有附加到 jQuery CDN 上吗?这是因为该.media
属性检查给定的文件路径是否包含http
or https
,并且仅将您的设置附加STATIC_URL
到相对的文件路径中。
另请注意,重复的文件名会被自动删除,因此我认为最好在每个需要它https://code.jquery.com/jquery-3.4.1.js
的小部件的开头包含 a 。这样,无论您以什么顺序呈现它们,jQuery 脚本都将始终出现在需要它的文件之前。
附带说明一下,在您的文件名中包含数字时我会小心。作为 Django 2.2,尝试订购脚本时似乎存在错误。
例如:
class FooWidget(forms.TextInput):
class Media:
js = ('foo1.js', 'foo2.js',)
class BarWidget(forms.TextInput):
class Media:
js = ('bar1.js', 'bar13.js',)
class SomeForm(forms.Form):
field1 = forms.CharField(widget=BarWidget)
field2 = forms.CharField(widget=FooWidget)
def __init__(self, *args, **kwargs):
super(SearchForm, self).__init__(*args, **kwargs)
看起来像:
<script type="text/javascript" src="/static/bar1.js"></script>
<script type="text/javascript" src="/static/foo1.js"></script>
<script type="text/javascript" src="/static/bar13.js"></script>
<script type="text/javascript" src="/static/foo2.js"></script>
我尝试了各种包含数字的名称组合,但我无法遵循逻辑,所以我认为这是一个错误。