Сообщения 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
}
})