繁体   English   中英

Ajax:如何在 json object 内部发送 FormData

[英]Ajax: How to send FormData inside of json object

为了让您更好地理解,请考虑我的 ajax 请求:

$.ajax({
    url: '{% url "validate-upload-single" %}',
    type: "POST",
    data: JSON.stringify({
        'mainForm': Myform,
        'currentForm': 1,
    }),
    dataType: 'json', // response type

在哪里:
var Myform = new FormData( $(this)[0] );

问题是当我发送请求时,我在服务器端得到一个空的“字典”。 我使用 Django 作为我的后端

DJANGO 查看:

print('SORTING THE POST REQUEST')
body = request.body.decode('utf-8')
serialized = loads(body)
print(f'POST: {request.POST}')
print(f'Body: {body}')
print(f'Serialized: {serialized}')

结果:

SORTING THE POST REQUEST
POST: <QueryDict: {'{"mainForm":{},"currentForm":1}': ['']}>
Body: {"mainForm":{},"currentForm":1}
Serialized: {'mainForm': {}, 'currentForm': 1}

我试过$("form").serializeArray()但这只返回文本数据,文件似乎丢失了

我想问题出在contentType header - 它应该是'multipart/form-data' 检查此链接以使其与 jQuery.ajax 一起使用

.js文件中,您必须添加 csrf 令牌的第一个块才能正常工作。

//Getting csrf token
var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val();

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});

然后你在 ajax 中使用 json,通过这里的变量“html_form”获取你想要显示的模板:

// Submit post on submit
$('#post-form').on('submit', function(event){
    event.preventDefault();
    console.log("form submitted!")  // sanity check

    //Send data to server for getting back sorted
    $.ajax({
        url: '/schedule/sort_group/',
        async: true,
        type: 'post',
        data: { //data sent with the post request
            group_field_value: $("#select_group").children("#group-option:selected").val(),
            lector_field_value: $("#select_lector").children("#lector-option:selected").attr("name"),
        },
        dataType: 'json',
        success: function (data) {
        $("#change_by_select").html(data.html_form);

        }
    });
});

在底部的views.py文件中,您需要像这样确定数据:

data['html_form'] = render_to_string('schedule/select_sort.html', context, 
request=request)
    return JsonResponse(data)

因此,我建议您将要从服务器检索的信息放入特定的另一个文件中,无论它是什么(字典或列表或其他数据结构或 html 模板)。 我希望它会有所帮助。 随意问任何问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM