Как предоставить $ сторонним, внешним плагинам jQuery в админке Django

Я включил пару сторонних плагинов 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;

до внешней ссылки все работало нормально. Но так ли это должно быть на самом деле?


person Danny W. Adair    schedule 30.03.2011    source источник
comment
Переопределение было бы вдвойне неправильным, поскольку вы объявляете какую-то глобальную переменную, которая не влияет на имена параметров функции.   -  person Lightness Races in Orbit    schedule 30.03.2011
comment
Извините, это была просто попытка грязного обходного пути. Я отредактировал вопрос, чтобы уточнить, что я вообще не хочу трогать эти файлы внешней библиотеки.   -  person Danny W. Adair    schedule 30.03.2011
comment
Я хочу сказать, что грязный обходной путь не сработает. :)   -  person Lightness Races in Orbit    schedule 30.03.2011


Ответы (3)


Переопределите статический файл django admin/js/jquery.init.js, создав файл с тем же именем и путем в каталоге staticfiles вашего приложения.

Оригинальное содержание это

/* 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).

person Philipp Zedler    schedule 06.02.2015
comment
Это создает больше проблем, чем решает. Теперь все мои другие плагины jQuery жалуются на то, что jQuery не существует. - person Cerin; 09.04.2015
comment
Мой сценарий заключался в том, что у нас есть куча существующего кода JS, который использует '$' для использования jQuery, и мы используем пару сторонних виджетов, которые включают jquery.init.js. Это нарушало наш другой код. Это решение сработало отлично. - person jdhildeb; 19.04.2021

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

Отличный обходной путь — реструктурировать файлы 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>
person Black Box Operations    schedule 30.03.2011
comment
1. Как только мне стали нравиться новые статические файлы... 2. Еще не пробовал, в чем волшебная разница? Разве это не просто динамическое обслуживание одного и того же статического файла? Появился ли $ к тому времени? - person Danny W. Adair; 30.03.2011
comment
Если подумать, то нет. Все эти проблемы на стороне клиента. - person Danny W. Adair; 30.03.2011
comment
Начните сверху, продвигайтесь вниз оттуда. Сначала переместите свой $ = django.Jquery; назначение выше всего остального, посмотрите, работает ли это. Если это не так, убедитесь, что все ваши теги ‹script› закрыты, даже включенные. Если это не сработает, вы используете Firebug/Chrome? Есть ли у вас дополнительная информация? - person Black Box Operations; 30.03.2011
comment
Спасибо за помощь. Пожалуйста, посмотрите мое последнее редактирование, у меня это работает, просто интересно, является ли это обычной/рекомендуемой практикой. - person Danny W. Adair; 30.03.2011

Для сторонних подключаемых модулей обычно лучше загрузить собственную копию 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, который не работает для многих новых/обновленных плагинов.

person Simon Steinberger    schedule 14.06.2013