Невозможно получить значения из запроса в Django - пустой QueryDict

Я новичок в ViewSets и пытаюсь получить значения, отправленные из внешнего метода fetch в объект запроса Django в функции create. Я не знаю, является ли это простой синтаксической ошибкой или данные не отправляются должным образом из front-end, но я думаю, что это проблема back-end.

Стрингированные данные в методе post, похоже, корректно регистрируются на фронт-энде, как в этом тесте:

{"title":"test","type":"landing","slug":"","notes":""}

Печать переменных в функции создания ViewSet, однако, показывает следующее:

print(request.POST["title"]) # fails with keyerror: 'title' MultiValueDictKeyError(key) django.utils.datastructures.MultiValueDictKeyError: 'title'
print(request["title"]) # fails with TypeError: 'Request' object is not subscriptable
print(request.POST.get("title", “test”)) # fails as print test
print(request.POST.get("title")) # fails as it just returns None
print(request.get("title")) # fails with AttributeError: 'WSGIRequest' object has no attribute 'get'
print(self.request.query_params.get("title", None)) # prints None
print(self.request.query_params)  # prints empty QueryDict: <QueryDict: {}>

Вот функция создания:

class PagesViewSet(viewsets.ViewSet):
    def create(self, request):
    # printing went here
        page = Page.objects.create(
            title="testing", type="other", slug="test-slug", notes="test notes"
        )
        serializer = PageSerializer(page)
        return Response(serializer.data)

Я просто закинул демо-данные в метод создания страницы, чтобы убедиться, что он работает, что и произошло, а теперь хочу использовать реальные данные, которые должны быть в запросе.

Кто-нибудь знает, в чем здесь может быть проблема?

Для наглядности, вот функция внешнего API-запроса:

const createPage = async (data: CreatePageFormInputs) => {
    console.log('stringified: ', JSON.stringify(data)); // logs correctly
    const res = await fetchCreatePage('http://localhost:8000/api/pages/', {
        method: 'POST',
        headers: { 'Content-Type': 'application/json' },
        body: JSON.stringify(data),
    });
};

Возможно, это не относится к делу, но если вам интересно, что такое fetchCreatePage, то это просто часть пользовательского хука react:

const fetchCreatePage: FetchDataFn = async (url, options?) => {
        const setFailed = () => {
            setFetchError(true);
            setLoading(false);
        };
        const setSuccess = (data: any) => {
            setData(data);
            setLoading(false);
        };

        try {
            setLoading(true);
            const res = await fetch(url, options);

            if (!res.ok) {
                console.log('Error detected. Returning...');
                setFailed();
                return;
            }

            if (res.status === 204) {
                setSuccess({
                    success: true,
                    info: 'Item successfully deleted',
                });
                return;
            }

            const data = await res.json();
            setSuccess(data);
        } catch (e) {
            setFailed();
        }
    }

Я предполагаю, что метод POST является правильным. Любая помощь будет оценена по достоинству, спасибо.

Вы записали данные как тело запроса в формате JSON. Таким образом, вы должны декодировать формат JSON в словарь с:

import json

data = json.loads(request.body)
print(data['title'])

Если вы используете запрос от фреймворка Django REST, вы работаете с request.data:

import json

print(request.data['title'])

request.data будет искать параметры POST и тело JSON.

Вернуться на верх