表单中的 Django Media 资源,如何延迟/异步 JS 资源?

run*_*ace 3 django django-forms django-widget

官方文档解释了如何自动为某些小部件添加资产。,从他们的示例:

from django import forms

class CalendarWidget(forms.TextInput):
    class Media:
        css = {
            'all': ('pretty.css',)
        }
        js = ('animations.js', 'actions.js')
Run Code Online (Sandbox Code Playgroud)

它没有描述的是如何使 JS 资源延迟或异步加载,例如

<script defer src="https://myserver.com/static/animations.js">/script>
Run Code Online (Sandbox Code Playgroud)

如何添加deferorasync属性?

Ego*_*ler 5

您可以覆盖小部件的 js-renderer:

表格.py

def render_js(cls):
    return [
        format_html(
            '<script defer src="{}"></script>',
            cls.absolute_path(path)
        ) for path in cls._js
    ]
forms.widgets.Media.render_js = render_js
Run Code Online (Sandbox Code Playgroud)

但是,它将与您应用程序的所有小部件相关。

UPD: 但是如果您需要每个小部件不同的渲染,我可以建议您使用以下技巧(使用“私有”属性来定义格式):

class CalendarWidget(forms.TextInput):
    class Media:
        css = {
            'all': ('pretty.css',)
        }
        js = ('animations.js', 'actions.js', 'defer')

def render_js(cls):
    fmt = '<script src="{}"></script>'
    formats = {
        'defer': '<script defer src="{}"></script>'
    }

    for path in cls._js:
        if path in formats:
            fmt = formats[path]
            break

    return [
        format_html(
            fmt,
            cls.absolute_path(path)
        ) for path in cls._js if path not in formats
    ]
forms.widgets.Media.render_js = render_js
Run Code Online (Sandbox Code Playgroud)