лучший способ сделать ajax в django

На днях я написал AJAX для приложения Django, над которым я работал.

Я родом из Ruby on Rails, поэтому я не сделал много на пути сырой JS.

Поэтому, основываясь на частицах Rails, я что-то похожее на следующее в своего рода псевдокоде, не потею детали:

1) Функция JS, использующая прототип Ajax.Updater ('tablediv', являющийся идентификатором таблицы, которую я хотел обновить Ajaxily, и url, указывающий на надлежащее представление django)

function updateTable(){ new Ajax.Updater('tablediv',url {params: params....etc 

2) django view, который получил новые данные, чтобы заполнить таблицу:

  def ajaxTable objects = Objects.object.all... return render_to_response('ajaxtable.html',objects) 

3) ajaxtable.html был просто своего рода «частичным» Rails, поэтому в основном таблица без <table> </table> …:

  <th>{{object.data}}</th> <td>{{object.moredata}}</td> 

так к моему фактическому вопросу:

Это показалось мне взломанным, я как бы бросил его вместе, устав искать в Интернете то, что хотел.

Так ли это сделано? Он отлично работает, я просто не знаю, что знаю, знаете ли?

4 Solutions collect form web for “лучший способ сделать ajax в django”

Это зависит от того, что вы хотите сделать, я думаю. Ajax, являющийся довольно широким спектром сценариев от Google Maps до простого автозаполнения, значительно отличается сложностью и лучшим подходом.

Однако есть некоторые полезные вещи, которые вы можете сделать с этой помощью.

1) Уровень шаблона

Убедитесь, что у вас есть параметр «django.core.context_processors.request» в настройке TEMPLATE_CONTEXT_PROCESSORS. Тогда вы можете это сделать;

 {% if not request.is_ajax %} <html> <head> ... </head> <body> ... {% endif %} actual content {% if not request.is_ajax %} </body> </html> {% endif %} 

В основном тогда говорят, что эта страница / test / вы можете сделать запрос браузера и получить полный контент или запрос через JavaScript и просто получить контент. Есть где-то блог-справочник, который объясняет это более подробно, но я не могу найти его в данный момент.

2) В представлении

В шаблоне мы просто обращаемся к объекту запроса в шаблоне. В представлении вы можете делать очень похожие вещи.

 def my_view(request): if requst.is_ajax(): # handle for Ajax requests # otherwise handle 'normal' requests return HttpResponse('Hello world') 

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

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

Я довольно поздно, но я хочу документировать, как объединить и адаптировать решения, представленные d0ugal, таким образом, что он разрешит гораздо более чистый шаблон-код.

У меня есть модель, представляющая контактных лиц.

Общий вид для получения одного ContactPerson выглядит следующим образом:

 def contcactperson_detail_view(request, name): try: person = ContactPerson.objects.get(slug=name) except: raise Http404 if request.is_ajax(): return contcactperson_detail_view_ajax(request, person) return list_detail.object_detail( request, queryset = ContactPerson.objects.all(), object_id = person.id, template_object_name = "contactperson", ) @render_to('cms/contactperson_detail_ajax.html') def contcactperson_detail_view_ajax(request, person): return {'contactperson':person, 'is_ajax':True} 

Шаблон для визуализации представления, который обрабатывает один contcactperson_detail_view.html называется contcactperson_detail_view.html :

 {% extends "index.html" %} {% block textpane %} <h1 id="mainheader">{{ contactperson.first_name }} {{ contactperson.family_name }} </h1> <div class="indentation">&nbsp;</div> {% include 'cms/contactperson_detail_photo.html' %} <div id="text_pane"> {% include 'cms/contactperson_detail_textpane.html' %} </div> {% endblock %} 

Он включает в себя два подшаблола

 contactperson_detail_textpane.html <p>{{ contactperson.description }}</p> <ul> <li> <dl> <dt>Email</dt> <dd> {{ contactperson.mail }} </dd> </dl> </li> <li> <dl> <dt>Contact Person for</dt> <dd> <ul> {% for c in contactperson.categories.all %} <li><a href="{% url category-view c.slug %}">{{ c }}</a></li> {% endfor %} </ul> </dd> </dl> </li> </ul> 

и contactperson_detail_photo.html

 {% with contactperson.photo.detailphoto as pic %} {% with pic.url as pic_url %} <div {% if not is_ajax %}id='imageContainer'{% endif %} style="float: right;padding-right:0.5em; padding-bottom: 1em; padding-left:0.5em;clear:both; width:{{ pic.width }}px"> <div style="width:{{ pic.width}}px"> <img style="clear:both" src="{{ pic_url }}" alt="{{ i.name }}"/> </div> </div> {% endwith %} {% endwith %} 

эти 3 шаблона будут использоваться, если запрос не является ajax.

Но если запрос ajax, contcactperson_detail_view вернет представление contcactperson_detail_view_ajax , которое использует шаблон contactperson_detail_ajax.html для рендеринга. И этот шаблон выглядит так:

 <h1>{{ contactperson.first_name }} {{ contactperson.family_name }}</h1> {% include 'cms/contactperson_detail_photo.html' %} {% include 'cms/contactperson_detail_textpane.html' %} 

Таким образом, он использует те же подшаблоны, но не расширяет ничего, поэтому поставляется только необходимая разметка. Когда представление ajax проходит is_ajax = True для шаблона, его можно использовать для настройки незначительных вещей, например, для установки правильных идентификационных атрибутов.

Контекстно-процессор или дополнительный url-conf не требуется.

Наконец, код Javascript:

 $("#contact_person_portlet a").click(function(event){ event.preventDefault(); $.ajax({ type: "GET", url: event.target.getAttribute('href'), success: function(msg){ overlay(msg); } }); }); 

Надеюсь, что это будет полезно для некоторых людей. Если да, оставьте комментарий!

Независимо от того , вам понадобится как минимум две вещи:

  1. Ваш код javascript, чтобы позвонить (у вас есть)

  2. Код на стороне сервера для обработки запроса (это ваш вид и url-config)

В этом нет ничего «взломанного».

Третье, ваш файл шаблона, является необязательным, но, как правило, является хорошей практикой. Вы хотите отделить свою разметку от кода по многим причинам.

Поэтому я думаю, что у тебя есть правильная идея. Продолжать.

Что именно кажется взломанным? Похоже, это совершенно правильный способ сделать что-то.

Я предполагаю, что альтернатива будет сериализована для json и будет отправлена ​​обратно в фрагмент шаблона javascript.

  • Как реализовать namedtuple python в javascript
  • Формат NodeJS String, такой как Python?
  • Рекомендации по очистке экрана: Интерактивный график
  • интерактивный _standalone_ вывод от matplotlib
  • что может привести к тому, что html и script будут вести себя по-разному между итерациями цикла for?
  • Скрипты конечных пользователей
  • Могут ли шаблоны Mustache делать расширение шаблона?
  • Преобразование структуры каталогов в файловой системе в JSON с помощью Node.js
  • Python - лучший язык программирования в мире.