JavaScript `fetch()` не будет публиковать данные в Django

Проблема возникает в рамках Django. Соответствующие строки кода описаны ниже.

Это HTML-строки, в которых первая div и вложенная p будут заполнены другими HTML-элементами с помощью функции JavaScript; упомянутая функция JavaScript не приведена здесь для краткости:

<form method="POST">
    {% csrf_token %}
    <div id="bill">
    </div>
    <div>
        <p id="total"></p>
    </div>
    <button onclick="record_order()">llllll</button>
</form>

Вот коды JavaScript для более раннего record_order(), использованного в атрибуте onclick кнопки в HTML-строках:

function record_order() {
    fetch("http://localhost:8000/", {
        method: "POST",
        body: JSON.stringify({
            "a": 1,
            "b": "vb"
        }),
        headers: {
            "Content-type": "application/json; charset=UTF-8",
        }
    })
    .then((response) => response.json())
    .then((json) => console.log(json));
}

Кроме того, существует представление на основе классов, чей метод post переопределен следующим образом:

def post(self, request):
        print("---")
        print(request.POST)
        print("---")
        return HttpResponseRedirect("/")

Кнопка при нажатии должна вызывать JavaScript fetch(), который отправит данные на серверную сторону, чтобы к ним можно было получить доступ через request. Но консоль браузера выходит из системы:

order.js:42
POST http://localhost:8000/ 403 (Forbidden)
record_order    @   order.js:42
onclick @   (index):1331

и

Uncaught (in promise) SyntaxError: Unexpected token '<', "<!DOCTYPE "... is not valid JSON

С другой стороны, терминал выдает ошибку, токен CSRF, и ничего больше:

---
Forbidden (CSRF token missing.): /
<QueryDict: {'csrfmiddlewaretoken': ['qD77PCO0L62oexifqwHWPT9WjB3SaRyau3SDlApCokLhCVcQb98wNOHCdBLNDDwk']}>
---

Проблема, скорее всего, заключается в части выборки, однако попытка использовать несколько HTTP-заголовков вообще ничего не дала.

Как можно получить нужные данные в post() методе view и сохранить их в базе данных SQLite с помощью моделей Django?

Не рекомендуется для производства:

Вы можете освободить свой просмотр от ожидания токена csrf из формы:

from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator

@method_decorator(csrf_exempt, name='dispatch')
class MyView(View):
    def post(self, request):
        data = json.loads(request.body)
        print("Received Data:", data)
        return JsonResponse({"message": "Data received"})

Или в другом случае вам нужно отправить токен CSRF в post-запросе:

function getCSRFToken() {
    return document.querySelector('[name=csrfmiddlewaretoken]').value;
}

function record_order() {
    fetch("http://localhost:8000/", {
        method: "POST",
        body: JSON.stringify({
            "a": 1,
            "b": "vb"
        }),
        headers: {
            "Content-Type": "application/json; charset=UTF-8",
            "X-CSRFToken": getCSRFToken()  // here includes csrf token 
        }
    })
    .then(response => response.json())
    .then(json => console.log(json))
    .catch(error => console.error("Error:", error));
}
Вернуться на верх