首页 文章

使用Django RGBField找不到jQuery

提问于
浏览
0

我正在研究的项目使用了一个RGBField,它将这个脚本插入到模板中(因为我无法找到它所在的位置,所以在某个地方的django深处):

<script type="text/javascript">
                (function($){
                    $(document).ready(function(){
                        $('#id_color').each(function(i, elm){
                            // Make sure html5 color element is not replaced
                            if (elm.type != 'color') $(elm).colorPicker({"colors": ["f1c40f", "2ecc71", "9b59b6", "e74c3c", "34495e", "3498db", "1abc9c", "f39c12", "d35400"]});
                        });
                    });
                })('django' in window && django.jQuery ? django.jQuery: jQuery);
            </script>

在控制台中我收到错误: Uncaught ReferenceError: jQuery is not defined 我无法检查错误发生的位置,但删除RGBField可以防止出现此问题 .

在项目中使用Jquery,如果我在模板中使用jQuery,它工作正常(因此模板本身不是问题) .

我已经将django-jquery添加到项目中,并在模板的开头包含了 {% load staticfiles %} . 不解决问题 .

我一直在忽略整件事,但现在我需要用这个页面编写一个cypress测试,错误阻止了测试 .

柏树有办法忽略这个错误吗?或者有没有办法防止错误发生在一开始? RGBField是否有一个标志可以关闭jquery的检查?

运行 'django' in window 会生成 false ,并且运行 django.jQuery 会产生错误 . 运行 'django' in window && django.jQuery 产生 false 所以理论上这应该采取第二个选项,当我在控制台中运行时很好(但显然我遗漏了一些东西) .

编辑:

已安装的应用列表:

'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.humanize',
'whitenoise.runserver_nostatic',
'storages',
'django.contrib.staticfiles',
'django.contrib.flatpages',
'jquery',
'django.contrib.sites',
'django_activeurl',
'webpack_loader',
'widget_tweaks',
'argonauts',
'rest_framework',
'main',

2 回答

  • 0

    该错误很可能与这行代码有关:

    'django' in window && django.jQuery ? django.jQuery: jQuery

    理解并考虑ternary conditional可能会有所帮助 .

    开箱即用,Django Admin在全局窗口上设置了一个'django'变量,并将jQuery引入它 . 这是因为管理员使用了jQuery . 在管理员之外,在自定义模板中,由开发人员决定如何在需要时包含jQuery .

    所以语句 'django' in window && django.jQuery 将在Django Admin页面和三元组的"true"评估为 true ,该片段继续并引用它 . 或者在三元组的假方面,假设jQuery已经出现在全球范围内 . 然后将对jQuery的引用作为参数传递给IIFE .

    我会仔细查看您的页面源,以确定是否/在哪里引用jQuery模块,并确保在该片段之前正确加载它 .

  • 0

    默认情况下,当抛出未捕获的异常时,赛普拉斯会失败测试 . 这种行为对许多用户都很有用,并且经常会向开发人员发出他们不知道的错误 .

    话虽这么说,有时会抛出未捕获的异常并且您想忽略它并继续进行测试(特别是如果它是从第三方插件中抛出的) . 您可以通过using Cypress events执行此操作 .

    To turn off all uncaught exception handling:

    Cypress.on('uncaught:exception', (err, runnable) => {
       // returning false here prevents Cypress from failing the test
       return false
    })
    

    您可能希望在支持文件( cypress/support/index.js )中执行此操作,以便将其应用于所有规范文件 .

相关问题