防止 Django 表单插入页面头部加载的 javascript

Posted

技术标签:

【中文标题】防止 Django 表单插入页面头部加载的 javascript【英文标题】:Prevent Django form inserting javascript that is loaded in head of page 【发布时间】:2020-12-17 06:43:19 【问题描述】:

我使用 Django(版本 2.2.1)构建了一个应用程序。所有模板都扩展了一个基本模板,该模板按如下方式加载 jQuery:

    <script type="text/javascript" src="% static 'admin/js/vendor/jquery/jquery.min.js' %"></script>

在一个模板中,来自 django-autocomplete-light(版本 3.4.1)的自动完成输入字段和来自 django-bootstrap-datepicker-plus(版本 3.0.5)的日期选择器的组合导致日期选择器无法工作,由于引导日期选择器无法初始化 jQuery。 原来我偶然发现了和in this question提到的同样的问题。

问题在于模板包含一个表单,其中包含一个ModelSelect2 小部件。这个小部件使表单再次加载 jQuery,如其media 属性所示:

@property
def media(self):
    """Return JS/CSS resources for the widget."""
    extra = '' if settings.DEBUG else '.min'
    i18n_name = self._get_language_code()
    i18n_file = (
        '%s%s.js' % (I18N_PATH, i18n_name),
    ) if i18n_name else ()

    return forms.Media(
        js=(
            'admin/js/vendor/jquery/jquery%s.js' % extra,
            'autocomplete_light/jquery.init.js',
            'vendor/select2/dist/js/select2.full%s.js' % extra,
        ) + i18n_file + (
            'autocomplete_light/autocomplete.init.js',
            'autocomplete_light/forward.js',
            'autocomplete_light/select2.js',
            'autocomplete_light/jquery.post-setup.js',
        ),
        css=..., # omitted, because irrelevant for this question.
    )

我的问题:是否有可能防止这种双重加载 javascript 文件?

我猜一个表单必须能够在不知道它前面还呈现什么的情况下呈现自己。那么是否有可能以某种方式通知Form 已包含在模板中的任何javascript,以便Form.media() 可以排除已在表单外加载的javascript?

哦,具有讽刺意味的是:在查看这个问题时,我偶然发现了 this question,现在我发现在 django-autocomplete-light 的较新版本中,jQuery 已从媒体中删除,解决了我的问题......不过,我是仍然对这个问题的答案感兴趣,因为外部包提供的不同小部件组合可能会再次出现该问题。

【问题讨论】:

【参考方案1】:

通常这就是为什么有时您会在模板的基础中包含% block js %

how to organize JS files in Django?

【讨论】:

以上是关于防止 Django 表单插入页面头部加载的 javascript的主要内容,如果未能解决你的问题,请参考以下文章

防止页面重新加载表单按钮点击流星?

表单提交后如何防止页面重新加载 - JQuery

防止浏览器在重新加载父级时保留 iframe url

使用无显示按钮防止在 Jquery 表单提交上加载页面

关于HTTP头部信息X-Frame-Options的问题-防止网站被人嵌套

关于HTTP头部信息X-Frame-Options的问题-防止网站被人嵌套