【问题标题】:Why doesn't Django see my ajax request as ajax using `is_ajax()`?为什么 Django 不使用 `is_ajax()` 将我的 ajax 请求视为 ajax?
【发布时间】:2019-10-06 20:09:49
【问题描述】:

我正在发送GET 请求。我处理数据并获得重定向的链接。我知道需要将其发送回客户并从中移出。该链接有效。但由于某种原因,该函数没有进入is_ajax () 块。

$(document).on('click', '.top_up_pay', function (e) {
  var post_data;
  e.preventDefault();
  var amount = +$('tr.sum > td.price > span.value').text();
  var products_id = [];
  var products_count = [];
  var products_deliv = [];

  $.each($('.name'), function(){
    var id = $(this).attr('data-product_id');
    products_id.push(id);
    var count = $(this.parentNode.parentNode.parentNode).find('input[name="count"]');
    products_count.push(count.val());
    var deliv = $(this.parentNode.parentNode.parentNode).find('.delivery');
    products_deliv.push(deliv.val());
  })

  var new_post = $('.new_post > input')
  var ukr_post = $('.ukr_post > input')
  var recipient = $('.recipient > input')
  var phone = $('.phone > input')
  var sum = $('tr.sum > td.price > span.value');

  var data = {
    products_id: products_id,
    products_count: products_count,
    products_deliv: products_deliv,
    new_post: new_post.val(),
    ukr_post: ukr_post.val(),
    recipient: recipient.val(),
    phone: phone.val(),
    sum: sum.text(),
    comment: comment,
    amount: amount
  }

  $.ajax({
    type: "GET",
    url: "/payments/top-up-pay/",
    data: data,
    crossDomain: true,
    success: function(data){
      window.location = data.redirect_to
    },
    error: function(data){
      alert('Error')           //Error
    }
  })
  setTimeout(function () {
    window.location.href = "/products/";
  }, 2000);

观看次数

def top_up_pay(request):
    template = 'payments/top_up_pay.html'
    conf_currency = AppConfig.get_config('subscription_price_currency')    
    if request.method == "GET":
        global req_data
        req_data = get_request_data(request)
        amount = Decimal(req_data.get('amount'))
    if conf_currency:
        req_user = request.user
        invoice = Invoice.objects.create(
            invoice_type=INVOICE_TYPE.TOP_UP,
            user=req_user,
            amount=amount*100,
            currency=conf_currency
        )
        params = {
            "currency": invoice.currency,
            "amount": int(invoice.amount),
            'order_id': str(70),
            "operation_id": str(70),
            "order_desc": "payment",
        }
        integration = FondyIntegration(params)
        redirect_to = integration.checkout_url()
        if request.is_ajax():
            response = HttpResponse(json.dumps({'success': True, 'location': redirect_to}), content_type="application/json")
            return response
        else:
            return redirect(redirect_to)
    return render(request, template, ctx)

回复:

【问题讨论】:

  • 不确定我是否理解发生了什么。你怎么知道你的视图没有进入if request.is_ajax() 条件?您在 javascript 成功函数中实际得到的响应是什么?请注意,您的返回 JSON 设置了 location 而不是 redirect_to 参数。
  • 在调试器的帮助下,我确保这个块没有进入。
  • 在响应中我得到错误函数。
  • 那么您将看不到任何视图路径。在到达if is_ajax() 之前,您的视图在某处出现错误。你的 django 控制台显示什么?
  • 它应该给出什么?如何检查?

标签: jquery ajax django redirect request


【解决方案1】:

我不会将此标记为重复,因为“为什么 Django is_ajax() 没有将我的请求视为 AJAX 请求?”是一个与“为什么我的跨域 ajax 请求没有设置 X-Requested-With-Header”完全不同的问题。

但这本质上是原因,答案如下:

Cross-Domain AJAX doesn't send X-Requested-With header

此外,据我所知,您不需要跨域,因为您的 AJAX 请求是针对您自己的站点的。成功响应后重定向到另一个域,但这不是 AJAX 调用本身。

【讨论】:

    【解决方案2】:

    也许使用 HttpResponseRedirect 而不是在 Javascript 中这样做?如果您要发送 Json,那么使用 JsonResponse?

    【讨论】:

    • 之前从未使用过 is_ajax(),因此无法对此发表评论。
    猜你喜欢
    • 2012-06-20
    • 2018-07-06
    • 2016-08-28
    • 2011-12-07
    • 2015-09-14
    • 1970-01-01
    • 2013-07-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多