我是一个初学者,试图弄清楚如何同时使用Django和Fetch API.

我试着追问这个问题Django - taking values from POST request, JavaScript fetch API

了解如何将表单发布到Django视图,并从该视图访问数据.我不确定我的表头是否有问题.

我的html表单

            <form class="basicform">
               <label for="nametextbox">Change First Name</label>
               <input type="text" name="nametextbox">
            </form>`

我的FETCH POST请求

function postForm(id, form){
            var formData = new FormData (form);
            let response = fetch("{% url 'fetch-ppl' '12345' %}".replace('12345',id), {
                method: 'POST',
                body: formData,
                headers: { 'Accept': 'application/json, text/plain, */*',
                    'Content-Type': 'application/json',
                    "X-CSRFToken": getCookie("csrftoken") },
            })
            .then(response => response.json())
            .then(data=>{
                console.log(data);
            })
        return 'Post Done';
        }

我的帖子视图,我正try 将表单数据发送到

def post_form_rest(request, pk):
    ppl = PersonalData.objects.get(id=pk)
    serializer = PersonalDataSerializer(ppl,many=False)
    if (request.method == 'POST'):
        print("It's a Post Request")
        print(request.POST);
        print("Contents of Body")
        print(request.body);
        data = ["post request done"]
        return JsonResponse(data, safe=False)
    print("it wasn't a post request")
    return JsonResponse(serializer.data)

我的问题是,当我发送POST请求时,Django视图根本没有检测到任何POST数据,它只是跳到为我提供初始模型对象的json响应的末尾.(我没有收到任何打印声明,即"这是POST请求")

我在访问我try 发送的表单数据时遇到问题.Quest.POST为空,quest.Body也为空

2023-08-25 20:52:14 It's a Post Request
2023-08-25 20:52:14 
2023-08-25 20:52:14 <QueryDict: {}>
2023-08-25 20:52:14 
2023-08-25 20:52:14 Contents of Body
2023-08-25 20:52:14 
2023-08-25 20:52:14 b'------WebKitFormBoundary3j9PtnVhAWSkfB14--\r\n'
2023-08-25 20:52:14 

如果我访问URL,确实会吐出JSON.

作为参考,我设置了一个演示,但它可能会被删除:

表格:https://alisatlee.pythonanywhere.com/ 您可以查看console.log,只需在任意框中输入gibberish,然后按Enter键即可.

我想在这里发布一个请求: https://alisatlee.pythonanywhere.com/fetch-ppl/1/

推荐答案

问题是使用if (request.POST):.应该是if request.method == 'POST':,为什么能找到https://www.django-antipatterns.com/antipattern/checking-request-method-with-if-request-post.html,作者对问题的解释如下:

因为POST请求本身并不携带数据.通过判断是否 Quest.POST,我们正在判断请求的真实性.这 是QueryDict[Django-Doc].QueryDict的真实性为FALSE,如果 QueryDict为空.但并不是所有的POST请求都有"有效负载".为 例如,可以使用确认框来确认删除 对象发出POST请求,但没有任何数据作为有效负载.在那 如果If请求.POST判断将失败,但请求.方法将失败 仍然是"帖子".

Python-3.x相关问答推荐

Python ModuleNotFound错误,即使安装了模块

如何绘制交叉验证的AUROC并找到最佳阈值?

在Python中从列创建新行

如何将多个字典合并到一个列中,并为不同的行使用相同的键

使用数据库将文件从Sharepoint下载到文件系统

将列表转换为 pandas 数据框,其中列表包含字典

以特定方式重新排列 pandas 数据框的列

在Python中基于组/ID将两个数据帧进行映射,找出较接近的值

无法使用 curve_fit() 在 python 中复制高斯函数的曲线拟合

Pandas matplotlib:条形图占总数的百分比

将两列合并为一列,将它们制成字典 - pandas - groupby

如果网站加载时间过长,如何强制 Selenium 刷新

列出相同索引的Pandas

为什么 numpy 的 `np.char.encode` 会将一个空的 unicode 数组变成一个空的 `float64` 数组?

使用正则表达式提取字符串之间的文本

过滤查询集和Q运算符的不同值

集合操作:应该只适用于集合,但适用于 dict_keys?

创建一个可旋转的 3D 地球

导入 python 模块而不实际执行它

在 Ubuntu 上为 Python3 安装 mod_wsgi