Отправка POST JSON запроса на сервер Django

Есть JS код для отправки данных в виде HTML form.

async function request(url, form, csrftoken) {
    const response = await fetch(url, {
        method: 'POST',
        headers: {'X-CSRFToken': csrftoken},
        body: new FormData(document.forms.namedItem(form)),
    })
    const result = await response.json()
    return result
}

Есть Python скрипт для обработки запроса.

def test_r(request):
    if request.method == 'POST' and request.user.is_authenticated:
        user = auth.get_user(request)
        pub = BasicText.objects.create(
            date_time=datetime.now(),
            text=request.POST.get('text'),
            user_name=user,
        )

    return JsonResponse({'id': f'{pub.id}', 'date_time': pub.date_time, })

В данном виде сервер Django получает данные из HTML from (текст из input) и сохраняет в БД. Однако при попытке отправить данные на сервер в виде JSON request.POST пустует. Пробовал в таком виде данные отправлять, но как я уже писал request.POST.get() не выдаёт никаких результатов. Функция request_json НЕ работает.

async function request_json(url, csrftoken) {
    const response = await fetch(url, {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json;charset=utf-8',
            'X-CSRFToken': csrftoken,
        },
        body: JSON.stringify({
            'text': 'test_data',
        }),
    })
    const result = await response.json()
    return result
}

Как сделать так, чтобы можно было отправлять на сервер Django POST запрос с данными JSON?
--- PS ----
В итоге сделал таким образом (спасибо за ответы):
JS

async function request(url, data, csrftoken) {
    const response = await fetch(url, {
        method: 'POST',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded',
            'X-CSRFToken': csrftoken,
        },
        body: JSON.stringify(data),
    })
    const result = await response.text()
    return result
}
async function check_username() {
    const url = '{% url "check_name_s" %}'
    const data = {'name': document.getElementById('name').value, }
    const csrftoken = '{{ csrf_token }}'
    const result = await request(url, data, csrftoken)
    console.log(result)
}

Python

from json import loads
def check_name_s(request):
    if request.method == 'POST':
        print(loads(request.body)['name'])

    return HttpResponse('hello')

Ответы (1 шт):

Автор решения: alex

Суть заключается в том, что в request.POST будут спарсены данные отправленные с типом контента application/x-www-form-urlencoded, а если тип контента application/json, то получить данные отправленные клиентом можно из request.body.

код вью

@csrf_exempt
def ajax(request):
    print("POST:", request.POST)
    print("BODY:", request.body)
    return JsonResponse({"status": "success"})

отправляю запрос

import requests


requests.post("http://127.0.0.1:8000/ajax/", data={"a": "b"})

в логе

POST: <QueryDict: {'a': ['b']}>
BODY: b'a=b'

а теперь json

requests.post("http://127.0.0.1:8000/ajax/", json={"a": "b"})
POST: <QueryDict: {}>
BODY: b'{"a": "b"}'

т.е. тебе нужно самому десериализовать это.

import json


@csrf_exempt
def ajax(request):
    print("POST:", request.POST)
    print("BODY:", json.loads(request.body))
    return JsonResponse({"status": "success"})
→ Ссылка