Как управлять модулями Javascript в шаблонах Django? - PullRequest
10 голосов
/ 18 ноября 2009

Допустим, нам нужна библиотека фрагментов функциональности на основе JavaScript (я думаю, jquery): Например:

  1. диалоговое окно Ajax
  2. Выбор даты
  3. валидатор формы
  4. скользящая строка меню
  5. баян

Для каждого существует четыре фрагмента кода: немного Python, CSS, JS и HTML.

Как лучше всего расположить все эти кусочки так:

  • каждый javascript 'модуль' может быть аккуратно использован различными представлениями
  • четыре бита кода, составляющие завершенную функцию, остаются вместе
  • части css / js / html отображаются в своих правильных местах в ответе
  • общие зависимости между модулями не повторяются (например, общий файл javascript)

х --------------

Было бы хорошо, если или есть какой-то способ гарантировать, что при вызове из тега шаблона шаблоны соблюдают директивы {% block%}. Таким образом, можно создать один шаблон с блоком для CSS, HTML и JS в одном файле. Вызовите это через шаблон тега, который вызывается из шаблона любого вида представления, который этого хочет. Это имеет какой-то смысл. Можно ли это как-то сделать уже? Мои шаблоны тегов шаблона, похоже, игнорируют директивы {% block%}.

х --------------

Существует несколько очень существенных проблем с размещением таких носителей в формах здесь http://docs.djangoproject.com/en/dev/topics/forms/media/, которые, вероятно, применимы к примерам валидатора форм и выбора даты.

Ответы [ 4 ]

6 голосов
/ 09 марта 2010

Прошло много времени с тех пор, как я опубликовал эту проблему. То, что я делал, чтобы решить это:

  1. напишите нужные вам части javascript в виде библиотеки, которая обслуживается статически
  2. вызов подпрограмм в статической библиотеке из шаблона со значениями на стороне вашего сервера

Ограничение требуется, чтобы написать его таким образом, чтобы он действовал только как сценарий на стороне клиента; не поддавайтесь соблазну попробовать ввести значения с сервера во время обслуживания js. В конечном счете я нашел менее запутанным применение переменных на стороне сервера строго в html-шаблоне.

Таким образом, я могу:

  1. сохранить селекторы javascript на тегах html внутри одного и того же файла (т. Е. Шаблона)
  2. полностью избегать тегов-шаблонов
  3. повторно использовать каждую библиотеку javascript в разных местах и ​​
  4. хранить фрагменты css / js / html во всех местах, где они могут быть найдены

Это не идеально, но оно заставляет меня ждать, пока не придет более аккуратная идея.

Например, библиотека js в «media / js / alertlib.js» может содержать:

function click_alert(selector, msg){ 
    $(selector).click(function(){ alert(msg) })
}

и шаблон имеет:

<script type="text/javascript" src="media/js/alertlib.js"></script>
<script type="text/javascript">
    click_alert('#clickme', {% message %})
</script>

<div id='clickme'>Click Me</div>
1 голос
/ 12 июля 2012

Взгляните на Джанго Секизай , который был создан именно для этой цели.

1 голос
/ 18 ноября 2009

Если более чем одна страница использует данный файл JS, вам следует рассмотреть возможность объединения всех их вместе и минимизации результата. Это уменьшает количество сетевых подключений, что улучшает общее время загрузки страницы. Не забудьте сократить время истечения как минимум на неделю или две.

0 голосов
/ 18 ноября 2009

Я думаю, вам будет трудно собрать все четыре части и применить их одним махом - просто потому, что некоторые появляются в ваших тегах <head>, а другие - в тегах <body>.

Что было сделано, так это то, что jQuery загружен для всех страниц моего base.html (а также моего базового css-файла) ... тогда у меня есть блочные теги для {% block css %} и {% block js %}. Шаблоны, которые наследуют файл base.html, могут предоставлять свои собственные javascript и css (и только тот материал, который необходим).

Я создал несколько шаблонных тегов, которые создают функции ajax, вывод которых основан на отображаемом объекте (например, включая object_id) - что сокращает перекодирование.

Одна вещь, которую я не пробовал, но меня интересует, это django-compress .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...