如何在Django admin中向第三方外部jQuery插件提供$

我在我的Django管理员基础模板中包含了几个第三方jQuery插件,假设“$”可用。

对于我自己的代码,我一直很乐意这样做

(function($) { my_code = 'here'; })(django.jQuery); 

但是如何向外部文件中的其他人的代码提供“$”?

  

抱怨“$​​”未定义。 我试过放

 var $ = django.jQuery; 

在那个外部引用之前,但无济于事(顺便说一下,为什么会这样?我理解加载同时发生,但是执行?我可以在定义之后立即使用“$”。)。

我对Django管理员提供的jQuery版本感到满意,并且真的不想加载另一个版本。 我也不想编辑其他人的插件,以便从上面的“$”重新定义开始。 编辑:我也不想像我自己的代码一样包装它,我只是不想触摸这些文件。

我是否真的不得不将$ .getScript() – http://api.jquery.com/jQuery.getScript – 放入我的匿名函数来加载这些文件?

编辑:在实际查看外部文件jquery.json-2.2.min.js之后,我看到它已经被包装到一个函数中,假定“jQuery”可用,而不是“$”。 插入后

var jQuery = django.jQuery;

在外部参考之前,它工作正常。 但这真的应该如何做到这一点?

通过在应用程序的staticfiles目录中创建具有相同名称和路径的文件来覆盖django的静态文件admin/js/jquery.init.js

原始内容是这样的

 /* Puts the included jQuery into our own namespace using noConflict and passing * it 'true'. This ensures that the included jQuery doesn't pollute the global * namespace (ie this preserves pre-existing values for both window.$ and * window.jQuery). */ var django = { "jQuery": jQuery.noConflict(true) }; 

只需删除.noConflict(true)

是的,我记得这个问题。 我感觉到你的痛苦。

一个很好的解决方法是重构你的js文件,以便Django可以将它们作为URL读取。 在您的URL文件中,添加以下模式:

 urlpatterns = patterns((r"^js(?:/(?P\w+))?", "app.views.render_js")) 

现在,在init .py中,添加以下代码:

 JS_FILES = {"name" : "name.js", "thing" : "thing.js"}; def render_main_js(req, type = None) : return render_to_response(JS_FILES.get(type, "main.js"), mimetype="text/javascript"); 

一旦代码到位并假设您在/ js / *中有javascript文件,您可以使用以下代码包含您的javascript:

   

对于第三方插件,通常最好包含其他插件之前加载自己的jQuery副本。 对于Django 1.4+,您可能在相应的admin.py文件中看起来像这样:

 class Media: js = ( 'http://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js', '/static/js/third_party_plugin.js', ) 

如果您的插件依赖于最新版本的jQuery,您也可以通过在插件顶部定义$和jQuery来使用Django的包含版本:

 var jQuery = django.jQuery, $ = jQuery; 

从版本1.6开始,Django将随jQuery 1.9.1一起提供。 在此之前,使用了jQuery 1.4,它不适用于许多新的/更新的插件。