Сообщения Django с API javascript fetch() и редиректом

Я делаю запрос с помощью API fetch() к представлению django, которое устанавливает сообщение с помощью приложения messages и перенаправляет запрос. Я могу перехватить перенаправление с помощью response.redirected и messages-cookie устанавливается, но когда я делаю перенаправление с помощью location.replace, сообщения теряются.

Как передать сообщения из исходного ответа?

Вид django:

def add(request):

    if request.method != 'POST':
        return HttpResponse("not post")

    pproject = request.POST['pproject']

    print("pproject:", pproject)

    messages.add_message(request, messages.INFO, "Test.")
    return redirect("project_detail")

мой urls.py:

    path('project/add/', views_project.add, name='project_add'),

и в моем шаблоне (javascript):

var csrftoken = document.querySelector('[name=csrfmiddlewaretoken]').value;
const headers = new Headers();
headers.append("X-CSRFToken", csrftoken);

const form = new FormData();

form.append("pproject", "{{ project.id }}");

const ops = {
    method: "POST",
    headers: headers,
    body: form,
    credentials: "same-origin"
};

const req = new Request("{% url 'project_add' %}");

fetch(req, ops)
.then((response) => {
    if (response.redirected) {
        console.log("response redirect:", response);

        window.location.replace(response.url);
        return false;

    } else if (!response.ok) {
        throw new Error(`HTTP error! Status: ${response.status}`);
    } else {
        return response.json(); // Parse JSON response
    }
})

Views.py

from django.http import HttpResponseRedirect
from django.urls import reverse

def add(request):
    if request.method != 'POST':
        return HttpResponse("not post")
    
    pproject = request.POST['pproject']
    messages.add_message(request, messages.INFO, "Test.")
    
    # Construct the redirect URL with messages as query parameters
    redirect_url = reverse("project_detail") + "?message=test"

    return HttpResponseRedirect(redirect_url)

JavaScript

fetch(req, ops)
.then((response) => {
    if (response.redirected) {
        const url = new URL(response.url);
        const message = url.searchParams.get("message");
        
        if (message) {
            // Display the message
            console.log("Received message:", message);
        }

        window.location.replace(response.url);
        return false;
    } else if (!response.ok) {
        throw new Error(`HTTP error! Status: ${response.status}`);
    } else {
        return response.json(); // Parse JSON response
    }
})
Вернуться на верх