首页 > 解决方案 > 如何使用 React 向 DRF 发送未知数量的过滤器值?获取还是发布?

问题描述

我正在构建一个过滤系统,您可以在其中按品牌和类别过滤产品。用户在 React 应用程序中选择过滤器,这会触发对后端 API(Django Rest Framework - DRF)的请求,即 GET 或 Post。理想情况下,Django 会接收过滤器名称作为它可以迭代的值。

我对如何实现这一目标非常迷茫。

GET 请求是可能的。但是为了使 DRF 能够处理请求,它需要具有这样的 uri 格式:

http://127.0.0.1:8000/filter/?categories=proviant&categories=multipower&brands=kellogs

然后我可以使用这样的视图来获取值。

class ProductFilterListView(APIView):

    def get(self, request):
        for el in request.GET.getlist('categories'):
            print(el)
        return Response('')

这是一个相当大的挑战,因为 axios(用于发出 JS 请求的库)没有根据 DRF 的要求格式化 url 的选项。所以这感觉非常错误且非常手动,并且几乎不是一个“好”的解决方案(?)

另一种方法是使用发布请求。但话又说回来,我从来没有对没有序列化程序或 Django 端的表单的东西使用过发布请求。所以,我不知道如何验证传入的帖子数据并将其转换为 Django 可以使用的格式。

解决这个问题的“正确”方法是什么?

更新:::

我发现 axios 有一个 paramsSerializer 选项,允许将 uri 格式化为我需要的格式。这是解决方案的一个片段。所以我猜 GET 请求在路上…… (?)

try {
            const res = await axios.get(`${baseURL}product/filter/`, {
                params: {
                    categories: filterArr
                }, paramsSerializer: (params) => {
                    return Qs.stringify(params, {arrayFormat: 'repeat'})
                  },
            })
        } catch(e) {

        }

标签: djangoreactjsaxios

解决方案


值列表可以通过 URL 作为参数传递,如下所示:

http://localhost:8000/?categories=first,second,third

params当您发布、获取等(文档)时, Axios 需要一个参数:

const params = new URLSearchParams();
params.append('categories', [1, 2, 4, 76]);
axios.post('/foo', params);

推荐阅读