Пользовательский тег Django и jQuery

Я новичок в Джанго. Сегодня я создал несколько пользовательских тегов Django, что не так уж сложно. Но теперь мне интересно, как лучше всего включить некоторый код jQuery или некоторый код Javascript, упакованный в мое собственное определение тега. Каков обычный способ включения пользовательской библиотеки в мой код? Например:

{% faceboxify item %}

Итак, предположим, что он создаст определенный вывод HTML для плагина Facebox. Я просто хочу узнать какой-нибудь элегантный способ импортировать этот плагин в свой код. Я хочу, чтобы приведенного выше определения было достаточно для всех функций. Есть ли способ сделать это? Я не мог найти ни одного примера. Может я что-то упускаю..


person pocoa    schedule 13.06.2010    source источник


Ответы (2)


Из документации вы можете видеть, что написание тегов шаблона включает в себя написание целевой функции и средства визуализации. Итак, я предполагаю, что ваш текущий код выглядит так:

def my_tag(parser, token):
  # ... some code
  return MyNode(...)

class MyNode(template.Node):
  def render(self, context):
     # here is where you write your <script> tags

Таким образом, по сути, вам нужно повесить переменную в контексте, чтобы вы могли знать, если для этого конкретного запроса вы уже включили код для загрузки всех необходимых сценариев.

class MyNode(template.Node):
  def render(self, context):
     if '_included_faceboxify_deps' in context:
       # render your <script> dependency includes
       context['_included_faceboxify_deps'] = True
     # render your <script>s that are specific for this call

Это должно сработать. Это не так элегантно, как включение ваших зависимостей в верхнюю часть страницы, но достаточно не включать их каждый раз, когда вам нужно их вызывать.

person Miguel Ventura    schedule 13.06.2010

Вы можете сделать так, чтобы ваш пользовательский тег применял значения «класса» для вашего Javascript для поиска. Включите свой Javascript как обычный импорт .js <script> и заставьте его использовать функцию времени загрузки для поиска ваших элементов и манипулирования ими по мере необходимости.

Так, например, если ваш тег создает <div>, вы можете сделать так:

<div class='faceboxify'>
  <!-- whatever -->
</div>

Затем ваш Javascript может сделать это:

$(function() {
  $('div.faceboxify').each(function() {
    // ... stuff to be done to your "faceboxify" divs
  });
});
person Pointy    schedule 13.06.2010
comment
Спасибо. Мой вопрос был второй частью вашего кода, а также оператором импорта ‹script›. Должен ли я выводить все вместе ‹script type='text/javascript' src='facebox.js'›‹/script›‹script type='text/javascript'›$(function() { $('div.faceboxify') .each(function() { // ... то, что нужно сделать с вашими элементами div для faceboxify }); });‹/script› А затем: ‹div class='faceboxify'› ‹!-- что угодно --› ‹ /дел› - person pocoa; 13.06.2010
comment
Я хотел бы найти способ вставить вторую часть кода в общую функцию $(document).ready(function(){//here} страницы и вставить оператор импорта вверху. - person pocoa; 13.06.2010
comment
Ну, я не эксперт по Django, поэтому я не могу прокомментировать лучший способ сделать это. В системах шаблонов, с которыми я знаком, я бы, вероятно, не заставлял код тега записывать тег <script>. Я бы удостоверился, что сценарий был включен на соответствующие страницы с помощью взаимодействующих шаблонов для заголовков страниц. Хорошо это или плохо в Django, я не могу сказать. - person Pointy; 13.06.2010