Django div reload - ajax GET после POST не получает экземпляры последней модели базы данных

В приложении, похожем на чат, я использую вызовы ajax для POST нового сообщения и обновляю сообщения, отображаемые на странице, без перезагрузки всей страницы. Мой вызов ajax для публикации работает - в базе данных создается новый экземпляр сообщения. Однако впоследствии, когда я выполняю вызов ajax для GET всех сообщений, новое сообщение отсутствует в результирующем наборе запросов. Если я полностью обновлю страницу, я смогу увидеть все сообщения, но это не то, что мне нужно.

Шаблон сообщения HTML:

    {% for message in messages %}
    <p>
        {{ message.content }}
    </p>
    {% endfor %}

HTML-шаблон чата:

<div id = "chat">
    {% include "messages.html" %}
</div>

<form id = "post-message-form", method = "post" enctype = "multipart/form-data">
    [my form goes here]
</form>

JavaScript:

$('#post-message-form').on('submit', function(event){
    event.preventDefault();
    $form = $(this);
    var data = new FormData($form.get(0));

    $.ajax({
        url: '/post/a/new/message/',
        type: 'POST',
        data: data,
        success: refresh_chat,
        cache: false,
        contentType: false,
        processData: false
    })

    return false;
}

function refresh_chat(){
    $.ajax({
        url: '/get/all/messages/,
        type: 'GET',
        success: function(json) {
            $('#chat').html(json['data']);
        }
    })
    return false;
}

Взгляды:

import json
from django.template import loader
from .forms import MessageForm

# /post/a/new/message/
def post_message(request):
    if request.method == 'POST':
        form = MessageForm(request.POST)
        if form.is_valid():
            message = form.save()
            return HttpResponse(
                json.dumps({'status': 1,
                            'message': 'Message posted!'}),
                content_type='application/json'
            )

# /get/all/messages/
def get_messages(request):
    if request.method == 'GET':
        messages = loader.render_to_string('messages.html', context = {'messages': Message.objects.all(), 'form': MessageForm()})
        return HttpResponse(
            json.dumps({'data': messages}),
            content_type='application/json'
        )

Есть идеи, почему я не получаю последние данные из базы данных, когда вызываю ajax GET после POST? Спасибо!

success: refresh_div - это должен быть refresh_chat?
Robin Zigmond 21.11.2018 11:08

Да, извините, это была опечатка. Но проблема не в этом.

Viktor Petrov 21.11.2018 11:19

Какую базу данных вы используете?

Daniel Roseman 21.11.2018 13:39

SQLite, настройка приложения Django по умолчанию.

Viktor Petrov 21.11.2018 18:25
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
4
231
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Оказывается, если я обновляю чат с помощью вызова ajax "done" вместо "success", он работает:

$('#post-message-form').on('submit', function(event){
    event.preventDefault();
    $form = $(this);
    var data = new FormData($form.get(0));

    $.ajax({
        url: '/post/a/new/message/',
        type: 'POST',
        data: data,
        cache: false,
        contentType: false,
        processData: false
    }).done(function() {
        refresh_chat();
    });

    return false;
}

Спасибо за комментарий!

Другие вопросы по теме