如何在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,它不适用于许多新的/更新的插件。