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

Dan*_*air 11 django jquery namespaces admin external

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

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

(function($) {
    my_code = 'here';
})(django.jQuery);
Run Code Online (Sandbox Code Playgroud)

但是如何为外部文件中的其他人代码提供"$"?

<script src="{{ STATIC_URL }}js/jquery.json-2.2.min.js" type="text/javascript"></script>
Run Code Online (Sandbox Code Playgroud)

抱怨"$​​"未定义.我试过放

<script type="text/javascript">var $ = django.jQuery;</script>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

var jQuery = django.jQuery;

在外部参考之前,它工作正常.但这真的应该怎么做呢?

Phi*_*ler 5

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

原来的内容是这个

/* 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 (i.e. this preserves pre-existing values for both window.$ and
 * window.jQuery).
 */
var django = {
    "jQuery": jQuery.noConflict(true)
};
Run Code Online (Sandbox Code Playgroud)

只需删除.noConflict(true).


小智 1

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

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

urlpatterns = patterns((r"^js(?:/(?P<type>\w+))?", "app.views.render_js"))
Run Code Online (Sandbox Code Playgroud)

现在,在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");
Run Code Online (Sandbox Code Playgroud)

代码就位后,假设您的 javascript 文件位于 /js/* 中,您可以使用以下代码包含您的 javascript:

<script type="text/javascript" src="/js/name"></script>
<script type="text/javascript" src="/js/thing"></script>
Run Code Online (Sandbox Code Playgroud)