DJANGO: обновление div с помощью AJAX
Я создаю приложение для чата. До сих пор я добавляю сообщения чата с помощью jquery $.post () и это прекрасно работает.
Теперь мне нужно получить последнее сообщение чата из таблицы и добавить список на странице чата.
Я новичок в Джанго, так что, пожалуйста, не торопитесь.
Итак, как мне получить данные из таблицы чата обратно на страницу чата?
Заранее спасибо!
3 ответов:
Мой любимый метод для такого рода вещей-использовать тег включения
В основном вы создаете отдельный шаблон для визуализации отдельных объектов в шаблоне страницы
Шаблон страницы:
{% load message_tags %} <h3>Messages</h3> <div class="message_list"> {% for message in messages %} {% render_message message %} {% endfor %} </div>Templatetags/message_tags.py:
from django import template register = template.Library() @register.inclusion_tag('individual_message.html') def render_message(message): context_for_rendering_inclusion_tag = {'message': message} return context_for_rendering_inclusion_tagТеперь вы можете использовать тот же шаблон для отображения дополнительных сообщений, которые вы хотите добавить в
message_listdiv в отдельном представлении, которое вы можете вызвать из вашего кода ajaxdef ajax_retrieve_latest_message(request): # ... Get the lastest message render_to_response('individual_message.html', ...И ваш jQuery будет выглядеть что-то вроде того...
Для полноты описания ваш файл$.post(url_of_ajax_view, request_data, function(data, status) { if (status == 'success') { $(".message_list").append(data); } });individual_message.htmlбудет содержать всю разметку для отображения фактического сообщения на странице...Надеюсь, это все поможет :)
Поскольку вы уже используете сообщение AJAX, почему бы вам не вернуть данные из него и не вставить их в div? Представление, которое принимает сообщение, может возвращать отрисованный шаблон или JSON, и ваш javascript может вставить его в обратный вызов.
Чтобы этот процесс заработал, нужно многое сделать...
- клиент регулярно опрашивает сервер на предмет новых записей в чате
- сервер проверяет и отвечает только с новейшим
- клиент получает самые новые записи и добавляет их в DOM
Это может сбить с толку, когда вы только начинаете, потому что не всегда ясно, что делает клиент и что делает сервер, но если большая проблема разбита, я думаю, вы обнаружите, что это простой процесс.
Если клиент собирается регулярно опрашивать сервер для новых записей чата, то сервер (django) должен иметь некоторый тип API для этого. Ваше самое большое решение будет заключаться в том, какой тип данных возвращает сервер. Вы можете выбрать один из следующих вариантов: визуализированный HTML, XML, YAML или JSON. Самый легкий вес-это JSON, и он поддерживается большинством основных фреймворков javascript (и django включает в себя сериализатор JSON, так как это потрясающе).
# Your model I'm assuming is something to the effect of... class ChatLine(models.Model): screenname = model.ChatField(max_length=40) value = models.CharField(max_length=100) created = models.DateTimeField(default=datetime.now()) # A url pattern to match our API... url(r'^api/latest-chat/(?P<seconds_old>\d+)/$',get_latest_chat), # A view to answer that URL def get_latest_chat(request, seconds_old): # Query comments since the past X seconds chat_since = datetime.datetime.now() - datetime.timedelta(seconds=seconds_old) chat = Chat.objects.filter(created__gte=comments_since) # Return serialized data or whatever you're doing with it return HttpResponse(simplejson.dumps(chat),mimetype='application/json')Поэтому всякий раз, когда мы опрашиваем наш API, мы нужно вернуть что-то вроде этого..
На нашей фактической странице у нас есть тег[ { 'value':'Hello World', 'created':'2009-12-10 14:56:11', 'screenname':'tstone' }, { 'value':'And more cool Django-ness', 'created':'2009-12-10 14:58:49', 'screenname':'leethax0r1337' }, ]<div>, который мы назовем<div id="chatbox">, который будет содержать все входящие сообщения чата. Наш javascript simple должен опросить API сервера, который мы создали, проверить, есть ли ответ, а затем, если есть элементы, добавить их в окно чата.Конечно, я не проверял ничего из этого, но надеюсь, что это даст вам представление о том, как все это происходит.<!-- I'm assuming you're using jQuery --> <script type="text/javascript"> LATEST_CHAT_URL = '{% url get_latest_chat 5 %}'; // On page start... $(function() { // Start a timer that will call our API at regular intervals // The 2nd value is the time in milliseconds, so 5000 = 5 seconds setTimeout(updateChat, 5000) }); function updateChat() { $.getJSON(LATEST_CHAT_URL, function(data){ // Enumerate JSON objects $.each(data.items, function(i,item){ var newChatLine = $('<span class="chat"></span>'); newChatLine.append('<span class="user">' + item.screenname + '</span>'); newChatLine.append('<span class="text">' + item.text + '</span>'); $('#chatbox').append(newChatLine); }); }); } </script> <div id="chatbox"> </div>
Comments