首页 > 解决方案 > 无法在 django 中使用 ajax 发布请求检索表单数据

问题描述

我正在尝试从 ajax 发布请求中检索 views.py 中的表单数据 {orderId, email}。我已经使用了 csrf_token。但是变量在 httpResponse 中没有。以下是views.py 代码:

@csrf_exempt
def track(request):
    if request.method == 'POST':
        orderId = request.POST.get('order_id')
        email = request.POST.get('email')
        return HttpResponse(f"{orderId} and {email}") 

以下是ajax发布请求:

    $('#trackerForm').submit(function(event){
         event.preventDefault();
         $('#items').empty();
         var formData = {

            'order_id': $('input[name=order_id]').val(),
            'email': $('input[name=email]').val(),
            'csrfmiddlewaretoken': $('input[name=csrfmiddlewaretoken]').val(),
             encode: true
         };
         $.ajax({
            type: 'POST',
            url: '/shop/track/',
            data: 'formData'
         })
         .done(function(data){
            console.log(formData);
            console.log(data);
         })

    });

我得到了 console.log(formData) 的输出。但我没有得到 console.log(data) {the response from views.py} 它在控制台屏幕上显示为“None and None”,这意味着 orderId 和 email 的值为 None。请回复它。这将是一个很大的帮助。

标签: djangoajax

解决方案


豁免 csrf 不是一个好主意。相反,您可以使用 JQuery 表单submit()serialize(). 在您的模板中并为其form提供一个 id,然后在 ajax 函数中,通过 ID 使用 jquery 元素选择访问该表单。如下:

$.ajax({
        url: ajax_link,
        data: $('#your_form_id').serialize(),
        type: 'POST',

        success: function(res) {
            console.log(res);
            }
        });

在您的情况下,views.py您可以通过使用来确定请求是否是 ajax 调用 if request.is_ajax():。但无需提交表格。您可以使用 ajax 方法将任何数据作为 python dict()(或 javascript )传递。object例如,在 ajax 函数中,您可以拥有:data: {'email': $('#email_field').val(), 'oreder_id': $('#oreder_id').val() }

你里面的代码没问题views.py: orderId = request.POST.get('order_id'), email = request.POST.get('email'),但是如果你有两个输入字段,属性name等于你提交的表单email,它就可以工作。order_id


推荐阅读