如何解决Django中jQuery未定义及$(...).modal不是函数的问题?
解决Django项目中Modal调用的JS错误问题
核心问题分析
你遇到的$(...).modal is not a function错误,本质是Bootstrap版本与JS调用方式不匹配,加上脚本加载顺序仍有问题导致的:
- 若用Bootstrap 3/4:必须依赖jQuery,且加载顺序严格要求jQuery在前,Bootstrap JS在后,bootstrap-toggle要在Bootstrap JS之后
- 若用Bootstrap 5:已移除jQuery依赖,不能再用
$(...).modal()这种jQuery写法,要改用原生Bootstrap Modal API
分版本解决方案
方案一:使用Bootstrap 3/4(依赖jQuery)
严格按照以下顺序加载脚本:
<!-- 1. 先加载jQuery(建议用较新版本,比如3.x,避免兼容性问题) --> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.4/jquery.min.js"></script> <!-- 2. 加载Bootstrap的JS文件 --> <script src="{% static 'path/to/bootstrap.min.js' %}"></script> <!-- 3. 加载bootstrap-toggle.min.js(必须在Bootstrap JS之后) --> <script src="{% static 'passkeys/js/bootstrap-toggle.min.js' %}"></script> <!-- 4. 最后加载你的自定义脚本 --> <script type="application/javascript" src="{% static 'passkeys/js/base64url.js'%}"></script> <script type="application/javascript" src="{% static 'passkeys/js/helpers.js'%}"></script> <script type="application/javascript"> // 调用Modal的函数示例 function openModal() { $('#popUpModal').modal('show'); } </script>
方案二:使用Bootstrap 5(无jQuery依赖)
Bootstrap 5不再需要jQuery,需改用原生JS调用Modal,同时注意插件兼容性:
<!-- 1. 加载Bootstrap 5的bundle包(包含Popper.js,必须) --> <script src="{% static 'path/to/bootstrap.bundle.min.js' %}"></script> <!-- 2. 加载适配Bootstrap 5的toggle插件(原bootstrap-toggle可能不适配,需替换为兼容版本) --> <script src="{% static 'passkeys/js/bootstrap-toggle.min.js' %}"></script> <!-- 3. 自定义脚本 --> <script type="application/javascript" src="{% static 'passkeys/js/base64url.js'%}"></script> <script type="application/javascript" src="{% static 'passkeys/js/helpers.js'%}"></script> <script type="application/javascript"> // 调用Modal的函数示例 function openModal() { const modal = new bootstrap.Modal(document.getElementById('popUpModal')); modal.show(); } </script>
额外检查项
- 确认Bootstrap CSS已正确加载,否则Modal样式会异常
- 避免重复加载jQuery或Bootstrap JS,这会导致冲突
- 若使用Bootstrap 5,确保bootstrap-toggle插件是适配5.x版本的,否则会出现新的兼容性错误
内容的提问来源于stack exchange,提问作者zazzaro safari
相关产品推荐
相关产品推荐

