Отправка данных в базу данных через fetch и последующее отображение этих данных на html-странице через fetch снова без отправки формы или обновления страницы

У меня есть приложение на django. Я набираю комментарий в форме и отправляю его в базу данных через fetch.

мой js-код

document.getElementById("comment-form").onsubmit = function write_comment(e) {
        e.preventDefault();
        const sxolio = document.getElementsByName("say")[0].value;

        fetch('/comment', {
        method: 'POST',
        body: JSON.stringify({
            say: sxolio
        })
    })
    .then(response => response.json())
    .then(result => {
    //print result
    console.log(result);
}); 

my views.py

@requires_csrf_token
@login_required(login_url = 'login')#redirect when user is not logged in
def comment(request):
    if request.method != 'POST':
        return JsonResponse({"error": "POST request required."}, status=400)
    new_comment = json.loads(request.body)
    say = new_comment.get("say", "")
    user = request.user
    comment = Comment(
        user = user,
        say = say,
        photo = Userimg.objects.get(user = user).image
        )
    comment.save()
    return JsonResponse({"message": "Comment posted."}, status=201)

Далее я хочу отобразить этот комментарий и все остальные данные из моей базы данных на моей html-странице без обновления. В тот момент, когда я нажимаю кнопку post, я хочу, чтобы комментарий был отображен. Я не хочу обновлять страницу с помощью какого-то элемента.innerHTML = data.

мой js-код

function display_comments() {
    fetch('/all_comments') 
  .then(response => response.json())
  .then(all_comments => {
   do some stuff

my views.py

@login_required(login_url = 'login')#redirect when user is not logged in
def all_comments(request):
    all_comments = Comment.objects.order_by("-date").all()
    print(all_comments[0].serialize())
    return JsonResponse([comment.serialize() for comment in all_comments], safe=False)

Если я использую preventDefault, я вижу, что моя база данных была обновлена, но я не могу получить данные. Если я пропускаю prevent default, все работает нормально, но моя страница обновляется одновременно. Есть ли способ сделать и то и другое без обновления страницы?

Наиболее вероятная проблема заключается в том, что запрос представления all_comments выполняется до того, как comment закончил сохранение в БД.

Важно, чтобы ответ для comment был полностью возвращен до начала выборки для all_comments. Этого можно добиться, выполнив следующее...

function display_comments() {
    fetch('/all_comments') 
    .then(response => response.json())
    .then(all_comments => {
        console.log(all_comments);
    });
}

document.getElementById("comment-form").onsubmit = function write_comment(e) {
    e.preventDefault();
    const sxolio = document.getElementsByName("say")[0].value;

    fetch('/comment', {
        method: 'POST',
        body: JSON.stringify({
            say: sxolio
        })
    })
    .then(response => response.json())
    .then(result => {
        // print result
        console.log(result);

        // The request to /comment has finished it is now safe to request all 
        // comments.
        display_comments();
    });
} 
Вернуться на верх