【问题标题】:Cannot get values from request in Django - Empty QueryDict无法从 Django 中的请求中获取值 - 空 QueryDict
【发布时间】:2022-01-16 12:54:47
【问题描述】:

我是 ViewSets 的新手,我试图在 create 函数中获取从前端 fetch 方法发送到 Django 请求对象的值。我不知道这是否只是一个简单的语法错误,还是前端没有正确发送数据,但我认为这是一个后端问题。

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 是什么,它只是自定义反应钩子的这一部分:

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 方法是正确的。任何帮助将不胜感激,谢谢。

【问题讨论】:

    标签: django django-rest-viewsets django-viewsets


    【解决方案1】:

    您以 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 正文。

    【讨论】:

    • 嗯,有道理。成功了 - 谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-07
    • 2023-03-18
    • 2012-07-05
    • 1970-01-01
    • 2020-08-16
    • 2011-02-04
    • 2018-03-23
    相关资源
    最近更新 更多