Как предоставить $ сторонним, внешним jQuery-плагинам в Django admin - PullRequest
11 голосов
/ 30 марта 2011

Я включил несколько сторонних плагинов jQuery в свой базовый шаблон администратора Django, которые предполагают наличие «$».

Для моего собственного кода я всегда был рад просто сделать

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

но как я могу предоставить "$" для кода других людей, который находится во внешних файлах?

<script src="{{ STATIC_URL }}js/jquery.json-2.2.min.js" type="text/javascript"></script>

жалуется, что "$" не определено.Я пытался поставить

<script type="text/javascript">var $ = django.jQuery;</script>

перед этой внешней ссылкой, но безрезультатно (кстати, почему? Я понимаю, что загрузка происходит одновременно, но при выполнении? Я могу использовать этот "$" сразу после определенияэто.).

Я доволен версией jQuery, которую предоставляет администратор Django, и действительно не хочу загружать другую.Я также не хочу редактировать чужой плагин так, чтобы он начинался с переопределения «$» выше.РЕДАКТИРОВАТЬ: Я не хочу обернуть его, как мой собственный код, я просто не хочу касаться этих файлов вообще.

Неужели мне действительно нужно прибегнуть к установке $ .getScript () - http://api.jquery.com/jQuery.getScript - в мою анонимную функцию для загрузки таких файлов?

РЕДАКТИРОВАТЬ: После того, как я действительно посмотрел этот внешний файл jquery.json-2.2.min.js, я увидел, что он уже заключен в функцию, которая предполагает "jQuery "должен быть доступен, а не" $ ".После вставки

var jQuery = django.jQuery;

до внешнего обращения работал нормально.Но так ли это на самом деле?

Ответы [ 3 ]

3 голосов
/ 06 февраля 2015

Переопределите статический файл 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 (i.e. this preserves pre-existing values for both window.$ and
 * window.jQuery).
 */
var django = {
    "jQuery": jQuery.noConflict(true)
};

Просто удалите .noConflict(true).

1 голос
/ 30 марта 2011

Да, я помню эту проблему. Я чувствую твою боль.

Отличный обходной путь - реструктурировать ваши js-файлы таким образом, чтобы Django мог читать их как URL-адреса. В файле URL-адресов добавьте шаблон ниже:

urlpatterns = patterns((r"^js(?:/(?P<type>\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");

Как только код будет создан и при условии, что у вас есть файлы javascript в / js / *, вы можете включить свой javascript, используя код ниже:

<script type="text/javascript" src="/js/name"></script>
<script type="text/javascript" src="/js/thing"></script>
0 голосов
/ 14 июня 2013

Для сторонних плагинов обычно лучше загрузить собственную копию 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Вы также можете использовать версию Django, указав $ и jQuery в верхней части вашего плагина:

var jQuery = django.jQuery, $ = jQuery;

Начиная с версии 1.6, Django будет поставляться с jQuery 1.9.1.До этого использовался jQuery 1.4, который не работает для многих новых / обновленных плагинов.

...