Рендеринг объектов JSON с использованием шаблона Django после вызова Ajax
Я пытался понять, что это оптимальный способ сделать Ajax на Джанго. Читая материал здесь и там, я понял, что общий процесс:
сформулируйте свой вызов Ajax, используя некоторые JavaScript библиотеки (например, jQuery), настроить шаблон URL в Django, который ловит вызов и передает его в функцию просмотра
на Python функции вида извлеките интересующие вас объекты и отправьте их обратно клиенту в формате JSON или аналогичном (с помощью встроенного модуля сериализатора, или simplejson)
определите функцию обратного вызова в JavaScript, которая получает данные JSON и анализирует их, поэтому для создания любого HTML необходимо отобразить. Наконец, скрипт JavaScript помещает HTML туда, где он должен оставаться.
теперь, что я все еще не понимаю, это как шаблоны Django связаны со всем этим? по-видимому, мы вообще не используем силу шаблонов.
В идеале, я подумал, что было бы неплохо вернуть объект JSON и имя шаблона, чтобы данные могли быть повторены и создан блок HTML. Но, может быть, я здесь совершенно не прав...
единственный ресурс, который я нашел, который идет в этом направлении этот фрагмент (769) но я еще не пробовала.
Очевидно, что произойдет в в этом случае весь полученный HTML создается на стороне сервера, а затем передается клиенту. Функция JavaScript-callback должна отображать ее только в нужном месте.
Это вызывает проблемы с производительностью? Если нет, то даже без использования приведенного выше фрагмента, почему бы не форматировать HTML непосредственно в бэкэнде, используя Python вместо front-end?
большое спасибо!
обновление: пожалуйста, используйте фрагмент 942 потому что это улучшенная версия одного выше! я обнаружил, что поддержка наследования работает намного лучше таким образом..
8 ответов:
Эй, спасибо vikingosegundo!
мне тоже нравится использовать декораторы: -). Но в то же время я следовал подходу, предложенному фрагментом, о котором я упоминал выше. Единственное, используйте вместо этого фрагмент n. 942 потому что это улучшенная версия оригинала. Вот как это работает:
представьте, что у вас есть шаблон (например, 'субшаблон который будет использоваться.html') любого размера, который содержит полезный блок, который вы можете использовать повторно:
........ <div id="results"> {% block results %} {% for el in items %} <li>{{el|capfirst}}</li> {% endfor %} {% endblock %} </div><br /> ........импортировать в ваш файл представления фрагмент выше вы можете легко ссылаться на любой блок в ваших шаблонах. Интересная особенность заключается в том, что отношения наследования между шаблонами принимаются во внимание, поэтому если вы ссылаетесь на блок, который включает в себя другой блок и так далее, все должно работать просто отлично. Таким образом, "Аякс" -выглядит так:
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-ответа.
шаблон:
<div id="sortable"> {% include "admin/app/model/subtemplate.html" %} </div>включен шаблон (ака: субшаблон который будет использоваться):
<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.
в то время как шаблоны действительно только для целей презентации, это не должно иметь значения, если вы делаете это на стороне сервера или клиента. Все это сводится к отделению логики управления, выполняющей действие, от логики представления, которая просто отвечает за создание разметки. Если ваша логика управления javascript должна обрабатывать способ рендеринга или отображения HTML, то вы можете делать это неправильно, но если вы изолируете эту логику рендеринга для другого объекта или функции, и просто передавая ему данные, необходимые для рендеринга, тогда вы должны быть в порядке; он отражает, как мы разделяем наши контроллеры, модели и представления на стороне сервера.
взгляните на проект github:http://github.com/comolongo/Yz-Javascript-Django-Template-Compiler
он компилирует шаблоны django в оптимизированные функции javascript,которые будут генерировать вашу презентацию html с данными, которые вы передаете. Скомпилированные функции находятся в чистом javascript, поэтому нет никаких зависимостей от других библиотек. Поскольку шаблоны компилируются, а не анализируются во время выполнения, строки и переменные уже помещены в строки javascript, которые просто нужно объединить, поэтому вы получаете огромный увеличение скорости по сравнению с методами, которые требуют от вас манипуляций или скриптом, чтобы получить финальную презентацию дом. Сейчас есть только основные теги и фильтры, но их должно быть достаточно для большинства вещей, и больше тегов будет добавил как люди начинают делать запросы для них, или участие в проекте.
можно использовать
jquery.load()или аналогично, генерируя HTML на сервере и загружая его в DOM с помощью JavaScript. Я думаю, что кто-то назвал это AJAH.
к сожалению, шаблоны Django предназначены для выполнения только на стороне сервера. Есть хотя бы один проект для рендеринга шаблоны Django с использованием Javascript, но я не использовал его, и поэтому я не знаю, насколько быстро, хорошо поддерживается или обновляется. Кроме этого, вы должны либо использовать шаблоны Django на сервере, либо создавать динамические элементы на клиенте без использования шаблонов.
Comments