Django + Ajax w / jQuery:Serialize&解码

时间:2015-03-13 16:15:04

标签: jquery ajax django post

我正在尝试将我对POST数据的第一次Ajax调用写入Django视图。在我的生活中,我不能确定我有错误的地方。我相信问题是我无法确定在Django视图中应该在哪里处理json数据转储。提前谢谢!

以下是代码:

Django视图:

if request.method == 'POST' and request.is_ajax():

        u = mod.Applicant.objects.get(id = pulled_Applicant_ID)
        new_joint_owner = forms_a.AssetJointOwnerForm(request.POST.get('asset_owner'))

        if new_joint_owner.is_valid():
            new_joint_owner.save(commit=False)
            new_joint_owner.applicant= u
            new_joint_owner.save()

            return HttpResponse(json.dumps({'success': True}), mimetype='application/json')

        else:
            errors = new_joint_owner.errors
            return HttpResponse(json.dumps(errors))

我的jQuery / Ajax:

$(document).on('click', '.joint_owner_submit_btn', function(e){
    e.preventDefault(e);
    var current_div = $(this).parents('.joint_owner_workspace');
    var form_to_hide = $(this).parents('div#content').children('form#form_entry_input');
    //var details = $('form#joint_owner_add_form').serializeArray();
    $.ajax({

        type: 'POST',
        url: '/input/assets/joint_owner/',
        dataType: 'json',
        data: {'asset_owner' : $('form#joint_owner_add_form').serializeArray() },

        success: function(){
            form_to_hide.slideUp();
            current_div.slideDown();
            },

        fail: function (forms) {
            $('form#joint_owner_add_form').html(forms);
            console.log(forms);
            },
        });
    return false;
    });

4 个答案:

答案 0 :(得分:1)

看起来你没有通过CSRF token。您将在django文档中找到一个脚本片段。 您可能还想查看django-restframework。

答案 1 :(得分:1)

我正在阅读你的django视图,我看到一堆语法错误:

        new_joint_owner.applicant= u
        new_joint_owner.save()here

首先尝试修复它们,如果它们在您的代码中。看看500是否仍然存在。

答案 2 :(得分:1)

嗯,我本身并没有找到答案,但我确实找到了一种方法来解决我的实际问题。我认为我遇到的问题是处理序列化表单的输出。 POST数据如下所示:

<QueryDict: {'asset_owner': ['csrfmiddlewaretoekn=@#$.......&first_name=bob%middlename=""%last_name="smith"']}

所以我将JS / jQuery更改为以下内容:

var data_to_go = {}
data_to_go['first_name'] = $('input#id_first_name').val();
data_to_go['middle_name'] = $('input#id_middle_name').val()
data_to_go['last_name'] = $('input#id_last_name').val()
$.ajax({

    type: 'POST',
    url: '/input/assets/joint_owner/',
    dataType: 'json',
    contentType: "application/x-www-form-urlencoded;charset=utf-8",
    data: {"asset_owner" : JSON.stringify(data_to_go) },

POST数据现在看起来像:

<QueryDict{'asset_owner' : {"first_name" : "bob", "middle_name": "", "last_name" : "smith"}}

然后我可以通过

简单地将数据保存在视图中
    a = json.loads(request.POST.get('asset_owner'))
    new_joint_owner = forms_a.AssetJointOwnerForm(a)

我不知道为什么我会在序列化表单中获得crsf-token那样的东西,但是我应该在路上找到它。

答案 3 :(得分:0)

问题是,看起来你正在发送一个json字符串作为整个表单的有效负载。这肯定会让你的表单处理程序混乱。您有两种选择:要么让浏览器端发送普通表单数据,要么将其转换为json并将其反序列化为Python对象,然后再发送到django表单类。