【问题标题】:Django return JsonResponse and catch data in ajax requestDjango 返回 JsonResponse 并在 ajax 请求中捕获数据
【发布时间】:2017-12-13 11:13:41
【问题描述】:

这是我的看法。 我将 JsonResponse 返回到 ajax 请求,从我的视图 'line_product_total': total, 和其他上下文中捕获传入数据

    def get(self, request, *args, **kwargs):
    cart = self.get_object()
    product_id = request.GET.get('product')
    delete_product = request.GET.get('delete', False)
    product_added = False

    if product_id:
        product_instance = get_object_or_404(Product, id=product_id)
        amount = request.GET.get('amount', 1)
        try:
            if int(amount) < 1:
                delete_product = True
                return HttpResponse('IntegrityError', delete_product)
        except:
            raise Http404

        cart_product, created = CartProduct.objects.get_or_create(cart=cart, product=product_instance)
        if created:
            product_added = True
        if delete_product:
            cart_product.delete()
        else:
            cart_product.amount = amount
            cart_product.save()
        if not request.is_ajax():
            return HttpResponseRedirect(reverse('e_commerce:cart'))
            # return cart_product.cart.get_absolute_url
    if request.is_ajax():
        try:
            total = cart_product.line_product_total
        except:
            total = None
        data = \
            {
                'deleted': delete_product,
                'product_added': product_added,
                'line_product_total': total,

             }
        return JsonResponse(data)

    cart = Cart.objects.get(pk=cart.pk)
    return render(request, 'sales/cart.html', {'cart': cart})

js

     $('.type_number').change(function () {

    var product = $(this).next('input[type=hidden]').val();
    var amount = $(this).val();
    var data = {
        product:product,
        amount: amount
    };
    console.log(data);
    $.ajax({
        type: 'GET',
        url: '{% url "e_commerce:cart" %}',
        data: data,
        success: function (data) {
            $('#jquery-message').text('Added' + data.product_added + 'Deleted' + data.deleted);
            if (data.deleted) {
                $('#product-'+product).fadeOut;
            }
            else {
                $('#product-line-total-'+product).text(data.line_product_total);
            }
        },
        error: function(response, error) {
            $('#add-form').submit()
        }
    })
 })

模板

<form action="." method="GET">


 <h4 id="product-line-total-{{ product.id }}">{{ product.line_product_total }}</h4>

<input class="type_number" style="text-align: center;margin-left: -50px;" title="" type="number" name="amount" value="{{ product.amount }}">
        <input type="hidden" name="product" value="{{ product.product.id }}">
        <button type="submit"></button>
</form>

简而言之,我无法在我的 ajax 中捕获变量 line_product_total 它只是说Unresolved variable line_product_total

但我正在发送这个变量。什么问题? 伙计们至少告诉我问题本身不能以任何方式解决问题

提前谢谢你:)

【问题讨论】:

  • 这是在哪里说的?显示整个错误消息。
  • 没有错误信息,但我当然知道原因。数据不是来自我的views.py
  • 如何抓数据?请帮帮我丹尼尔罗斯曼
  • 如果这是问题所在,为什么data.product_addeddata.deleted 不会出错?
  • 我不知道,但是 line_product_total jquery 说没有这样的变量:(

标签: javascript jquery python ajax django


【解决方案1】:

您的视图代码并不总是返回 JsonResponse。您应该跟踪视图执行(在每个 return 语句之前添加一些 print 或 - 更好 - logging.debug())并记录您在客户端获得的有效响应,而不是盲目地假设您确实有一个 json 响应200 状态。

而且你的代码真的很糟糕,甚至很危险。

首先,GET 请求必须是幂等的(它必须改变服务器的状态)。将 GET 用于从数据库中创建/更新/删除对象的请求确实是在找麻烦。

那么您的异常处理程序不仅无用,而且有害。它们只捕获任何异常(包括SystemExit!)并默默地忽略它们,因此您永远不会知道何时、什么、如何以及为什么会出错。保持try 块尽可能短(如果可能,一个语句),只捕获您期望并知道如何处理的异常,记录您捕获的任何内容(尽可能多的上下文信息) ,如果你真的不知道如何处理异常,就让它传播。用户将收到 500 错误(是的,发生了糟糕的事情),并且(假设您的服务器和项目配置正确)您将收到一封带有完整回溯等的漂亮错误电子邮件,因此您知道出了问题并有机会修复它。

【讨论】:

  • 是的,我从 Chrome 网络选项卡视图中检查了它,返回数据 100% 正常,但 jquery 无法显示它。好的,谢谢您的建议和回答
猜你喜欢
  • 2017-12-24
  • 1970-01-01
  • 2021-03-03
  • 1970-01-01
  • 2021-11-26
  • 2018-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多