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

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

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

  • в функции просмотра Python получить интересующие вас объекты и отправить их обратно клиенту в формате JSON или аналогично (с использованием встроенного модуля serializer или simplejson)

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

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

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

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

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

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

Ответ 1

Привет, спасибо викиосегундо!

Мне тоже нравится использовать декораторы:-). Но тем временем я следил за подходом, предложенным фрагментом, о котором я упоминал выше. Единственное, используйте вместо фрагмент 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)

Ответ 2

Вот как я использую тот же шаблон для традиционного рендеринга и рендеринга 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

Ответ 3

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

Ответ 4

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

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

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

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

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

Ответ 8

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