【问题标题】:Passing POST request by AJAX, Django problem通过 AJAX 传递 POST 请求,Django 问题
【发布时间】:2021-11-01 13:54:40
【问题描述】:

我的看法是:

def creating_profile(request):
    if request.is_ajax and request.method == "POST":
        array = request.POST.get('nums')
        print(request.POST.get('nums'))
    else:
        print('it's not ajax')

我的js:

const RegisterForm = document.forms["RegisterForm"];
const csrftoken = document.querySelector('[name=csrfmiddlewaretoken]').value;
let nums = [1, 2, 3]
RegisterForm.addEventListener('submit', () => {
    $.ajax({
        headers: { 'X-CSRFToken': csrftoken },
        url: '/account/creating-profile/',
        type: 'POST',
        data: { nums: nums },
        success: function (data) {
            //
        }
    });

但它返回None print(request.POST.get('nums')) 的结果,如果有人帮助我解决这个问题,我会很高兴

更新:

【问题讨论】:

  • 在 $.ajax 中你缺少 dataType: 'json'
  • @TusharD 也没有
  • 看起来 request.POST 将无法访问 HTTP 请求中的非表单数据(json 数据),您需要访问 reqeust.body attr 参考:docs.djangoproject.com/en/dev/releases/1.5/…try ` print(json.加载(request.body.decode(“utf-8”)))`

标签: javascript django ajax django-views


【解决方案1】:

我对 Ajax 不是很熟悉,但是每当我尝试将数据从表单传递到视图时,我都会使用 FormData:

form_data = new FormData(document.getElementById("RegisterForm"))

这会将表单的所有字段添加到字典中,您可以在其中通过字段名称访问值。您可以使用 .append()

在其上添加

然后在你的请求中你可以使用

fetch("/account/creating-profile/", {
        headers: myHeaders,
        body: form_data,
        method:"POST"})

并使用

在您的视图中检索它
nums = request.POST["nums"]

编辑:

你的 JS 应该是这样的:

const csrftoken = document.querySelector('[name=csrfmiddlewaretoken]').value;
let nums = [1, 2, 3]
myHeaders = new Headers()
myHeaders.append("X-CSRFToken", csrftoken)
form_data = new FormData(document.forms["RegisterForm"]);
form_data.append("nums", nums) // <-- Here you can add anything to the form data using form_data.append("Key", value)

fetch("/account/creating-profile/", {
        headers: myHeaders,
        body: form_data,
        method:"POST"})

如果你不阻止默认 POST 的发生,这样做会在你的服务器上 POST 两次,你可以阻止它这样做:

$(function(){
    $("#RegisterForm").submit(function(){
        return false
    })
})

或使用事件监听器和 preventDefault(参见文档:https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault

【讨论】:

  • 我应该在哪里添加数据?就像我的 js 代码中的那个数组
  • 编辑了更多细节
  • 在 /account/creating-profile/ 'nums' 处给我 MultiValueDictKeyError :(
  • 嘿,它现在可以工作了,但是我收到两个查询请求,一个来自带有 nums 的 fetch,第二个我猜来自没有 nums 的 html 表单。我怎么能只吃一个?
  • 已编辑以获取更多详细信息。您可以根据需要使用 preventDefaults 或在 Ajax 中返回 False。
【解决方案2】:

您可以使用getlist() 方法从 POST 像这样访问列表对象

def creating_profile(request):
    if request.is_ajax and request.method == "POST":
        array = request.POST.getlist('nums')
        print(array)# this will return [1, 2, 3]
    else:
        print('it's not ajax')

关于 MultiValueDictKeyError 如果您的 request.POST['key'] 中不存在数据而不是引发 MultiValueDictKeyError 解决方案,则会发生这种情况是 使用get() 方法,如果给定的键没有任何值并且不会引发任何异常,它将返回None

要发送到服务器的数据。它可以是 JSON 对象、字符串或 数组。

 data: { "nums": nums }

检查这个doc.

【讨论】:

  • 不幸的是,它返回 [ ]
  • 您是否尝试将数据更改为 JSON 格式,例如 data: { "nums": nums }
  • 是的,我做到了,当我打印整个请求时,它只显示已发送的 html 表单值
  • 你好@MehranBahrami你能显示你的整个ajax调用代码,包括打开和关闭脚本标签
  • 嗨,这是我的 js 文件中的全部 ajax
猜你喜欢
  • 2018-09-26
  • 2019-11-26
  • 2022-01-20
  • 2018-12-13
  • 2021-01-02
  • 2018-11-10
  • 2021-01-05
  • 1970-01-01
  • 2012-07-12
相关资源
最近更新 更多