Рендеринг объектов JSON с использованием шаблона Django после вызова Ajax

Я пытался понять, что является оптимальным способом сделать Ajax в Django . Читая кое-что кое-где, я понял, что общий процесс:

  1. сформулируйте свой вызов Ajax с помощью некоторой библиотеки JavaScript (например, jQuery ), настройте шаблон URL в Django, который ловит вызов и передает его функции просмотра

  2. Механизм шаблонов Python
  3. Как перейти прямо к шаблону, в urls.py Django?
  4. Как использовать dicts в шаблонах Мако?
  5. Модуль% в шаблоне Django
  6. Django - выбор отображаемого имени
  7. Техника Python или простая система шаблонов для вывода текстового текста
  8. в функции представления Python извлекают интересующие вас объекты и отправляют их обратно клиенту в формате JSON или аналогичным (с помощью встроенного модуля сериализатора или simplejson )

  9. определить функцию обратного вызова в JavaScript, которая получает данные JSON и анализирует их, поэтому для создания любого HTML-кода необходимо отобразить. Наконец, скрипт JavaScript помещает HTML везде, где он должен оставаться.

Теперь, что я до сих пор не понимаю, так это, как шаблоны Django связаны со всем этим? По-видимому, мы вообще не используем возможности шаблонов. В идеале я подумал, что было бы неплохо передать объект JSON и имя шаблона, чтобы данные можно было повторить и создать HTML-блок. Но, может быть, я совершенно неправ здесь …

Единственный ресурс, который я нашел в этом направлении, – это фрагмент (769), но я еще не пробовал его. Очевидно, что в этом случае произойдет то, что весь полученный HTML создается на стороне сервера, а затем передается клиенту. Функция JavaScript-callback должна отображать ее в нужном месте.

Это вызывает проблемы с производительностью? Если нет, даже без использования вышеприведенного фрагмента, почему бы не форматировать HTML непосредственно в бэкэнд с помощью Python вместо front-end?

Большое спасибо!

ОБНОВЛЕНИЕ: используйте фрагмент 942, потому что это расширенная версия выше! Я обнаружил, что поддержка наследования работает намного лучше.

  • Как предотвратить автоматическое удаление в шаблонах Django?
  • как использовать функцию ajax для отправки формы без обновления страницы, что мне не хватает? Должен ли я использовать для этого режим отдыха?
  • Что не так со следующим кодом ajax?
  • Как вы можете сделать кнопку прокрутки вверх, как в Stackoverflow?
  • Как JSON кодирует объекты?
  • Как сделать POST с jQuery / Ajax в Django?
  • 8 Solutions collect form web for “Рендеринг объектов JSON с использованием шаблона Django после вызова Ajax”

    Привет спасибо vikingosegundo!

    Мне тоже нравится использовать декораторы :-). Но тем временем я следил за подходом, предложенным фрагментом, о котором я упоминал выше. Единственное, используйте вместо этого фрагмент n. 942, потому что это улучшенная версия оригинальной версии. Вот как это работает:

    Представьте, что у вас есть шаблон (например, «subtemplate.html») любого размера, который содержит полезный блок, который вы можете повторно использовать:

    ........ <div id="results"> {% block results %} {% for el in items %} <li>{{el|capfirst}}</li> {% endfor %} {% endblock %} </div><br /> ........ 

    Импортируя в свой файл просмотра фрагмент выше, вы можете легко ссылаться на любой блок в ваших шаблонах. Классной особенностью является то, что отношения наследования между шаблонами учитываются, поэтому, если вы ссылаетесь на блок, который включает в себя другой блок и т. Д., Все должно работать нормально. Итак, ajax-view выглядит так:

     from django.template import loader # downloaded from djangosnippets.com[942] from my_project.snippets.template import render_block_to_string def ajax_view(request): # some random context context = Context({'items': range(100)}) # passing the template_name + block_name + context return_str = render_block_to_string('standard/subtemplate.html', 'results', context) return HttpResponse(return_str) 

    Вот как я использую тот же шаблон для традиционного рендеринга и рендеринга Ajax-response.

    Шаблон:

     <div id="sortable"> {% include "admin/app/model/subtemplate.html" %} </div> 

    Включенный шаблон (aka: subtemplate):

     <div id="results_listing"> {% if results %} {% for c in results %} ..... {% endfor %} {% else %} 

    Ajax-view:

     @login_required @render_to('admin/app/model/subtemplate.html')#annoying-decorator def ajax_view(request): ..... return { "results":Model.objects.all(), } 

    Конечно, вы можете использовать render_to_response. Но мне нравятся эти раздражающие декораторы: D

    Нет причин, по которым вы не можете вернуть обработанный бит HTML с помощью Ajax и вставить его на существующую страницу в нужную вам точку. Очевидно, вы можете использовать шаблоны Django для рендеринга этого HTML, если хотите.

    Когда вы делаете Ajax, я не думаю, что вы используете шаблоны. Шаблон существует, так что вы можете легко создавать динамический HTML на стороне сервера и, следовательно, он предоставляет несколько программных крючков внутри HTML.

    В случае Ajax вы передаете данные JSON, и вы можете отформатировать его так, как хотите в Python. и элементы HTML / document будут сгенерированы на стороне клиента с использованием JSON с помощью некоторой библиотеки JavaScript, например jQuery на стороне клиента.

    Возможно, если у вас есть очень конкретный случай замены некоторого внутреннего HTML с HTML-страницы на стороне сервера, возможно, вы можете использовать шаблоны, но в этом случае для чего вам нужен JSON? Вы можете просто запросить HTML-страницу через Ajax и изменить внутренний или внешний или любой HTML-код.

    Шаблоны предназначены для презентации . Ответ на данные в формате X (JSON, JSONP , XML, YAML , * ml и т. Д.) Не является презентацией, поэтому вам не нужны шаблоны. Просто сериализуйте свои данные в формате X и верните его в HttpResponse.

    Хотя шаблоны действительно предназначены только для презентаций, не имеет значения, делаете ли вы это на стороне сервера или на стороне клиента. Все сводится к разделению логики управления, выполняющей действие, из логики представления, которая отвечает за создание разметки. Если ваша логика управления javascript должна обрабатывать то, как вы выполняете визуализацию или отображение HTML, тогда вы можете ошибаться, но если вы изолируете эту логику визуализации к другому объекту или функции и просто передаете ей данные, необходимые для рендеринга, тогда вы должны быть в порядке; это отражает то, как мы отделяем наши контроллеры, модели и представления от сервера.

    Взгляните на проект github: http://github.com/comolongo/Yz-Javascript-Django-Template-Compiler

    Он компилирует шаблоны django в оптимизированные функции javascript, которые сгенерируют вашу презентацию html с данными, которые вы передаете. Скомпилированные функции находятся в чистом javascript, поэтому никаких зависимостей от других библиотек не существует. Поскольку шаблоны скомпилированы вместо того, чтобы анализироваться во время выполнения, строки и переменные все уже помещены в строки javascript, которые нужно просто конкатенировать, поэтому вы получаете огромное увеличение скорости по сравнению с методами, которые требуют, чтобы вы выполняли манипуляции с dom или анализ синтаксиса скрипта чтобы получить окончательную презентацию. В настоящее время существуют только основные теги и фильтры, но для большинства вещей их должно быть достаточно, и будут добавляться больше тегов, поскольку люди начинают делать запросы для них или начинают вносить свой вклад в проект.

    Вы можете использовать jquery.load() или подобное, создавая HTML на сервере и загружая его в DOM с помощью JavaScript. Я думаю, что кто-то назвал это AJAH .

    К сожалению, шаблоны Django предназначены для выполнения только на стороне сервера. Существует хотя бы один проект для создания шаблонов Django с использованием Javascript, но я не использовал его, и поэтому я не знаю, как быстро, хорошо поддерживается или обновляется. Помимо этого, вам нужно либо использовать шаблоны Django на сервере, либо создавать динамические элементы на клиенте без использования шаблонов.

    Python - лучший язык программирования в мире.