通过AJAX向Django视图提交JS数组将返回TypeError

时间:2019-06-06 10:09:12

标签: javascript json ajax django

我有一个对象数组,需要提交给Django视图。 我将其字符串化并在控制台日志中检查结果。到目前为止,它仍然有效。但是,当我尝试在视图中检索它时,会出现一些错误。

我试图按照与该主题相同的方式来编辑代码,很遗憾,没有任何帮助。 我尝试使用ast.literal_eval而不是json.loads,传递'items[]'并通过request.POST.getlist收集数据以及使用request.bodyrequest.is_ajax()的解决方案。但是,没有人允许我检索数据。

var items = [];
var formInput = $('#inputbox').val();
items.push({'item': formInput ,  'metrics': metrics.toString()});

$('#id_search').click(function( event ) {
        $.ajax({
            type: 'POST',
            dataType: 'json',
            contentType: 'application/json; charset=utf-8',
            url: '{% url "list_of_items" %}',
            data: {'items': JSON.stringify(items),},

            success: function (response) {
                console.log(data);
            }
        });
    event.preventDefault();
});

和views.py:

def list_of_items(request):
    data = request.POST.get('items')
    data_received = json.loads(data)

    #another approach:
    response_json = request.body
    struct = {}
    try:
        response_json = response_json.decode('utf-8').replace('\0', '')
        struct = json.loads(response_json)
    except:
        print('bad json: ', response_json)

    #(...)

我好像传递了一个空对象。

TypeError at /list_of_items
the JSON object must be str, not 'NoneType'

此视图从同一模板(list_of_items.html)中的JS表单接收另一个POST请求,我想知道它是否干扰了我的Ajax POST。

2 个答案:

答案 0 :(得分:1)

您没有正确发送数据。来自docs

  

类似于字典的对象,包含所有给定的HTTP POST参数,条件是请求中包含表单数据。

您需要以key:value对的形式发送数据,或者需要以

的形式对request.body进行解码
data = request.body.decode('utf-8')
data_received = json.loads(data)

答案 1 :(得分:0)

这是发送ajax请求的正确方法。

    $.ajax({
        type: 'POST',
        url: '{% url "list_of_items" %}',
        data: {'items': JSON.stringify(items),},

        success: function (response) {
            console.log(data);
        }
    });

我还认为您绑定了Submit事件和click事件有误。此外,您正在提交事件上的ajax请求,而没有preventDefault