Django AJAX JSON响应在浏览器中显示为原始文本

0 投票
1 回答
1109 浏览
提问于 2025-04-18 05:32

我正在使用Django(1.4.2)在Pinax框架中开发一个Stripe网页应用,使用了以下工具:

  1. django-stripe-payments
  2. eldarion-ajax

目前一切都正常,除了ajax的响应(以JSON格式)似乎没有被任何ajax回调处理,因此在浏览器中显示为原始的JSON数据:

{"html": "\n\n<div class=\"change-card\">\n    <h2>Current Card</h2>\n    <p class=\"lead\">\n        \n            Current card on file is a <strong>Visa</strong>\n            ending in the digits <strong>4242</strong>.\n        \n    </p>\n    \n    \n    \n    <form action=\"/payments/a/change/card/\" data-stripe-key=\"\" class=\"form ajax\" data-replace-closest=\".change-card\" method=\"POST\">\n        <div style='display:none'><input type='hidden' name='csrfmiddlewaretoken' value='<>' /></div>\n        <input name=\"stripe_token\" type=\"hidden\" />\n        <a href=\"\" class=\"btn btn-primary change-card\">Change Card</a>\n    </form>\n</div>\n"}

这个SO问题看起来很相似,但没有官方的答案,提问者似乎已经找到了办法(根据评论来看),但他们的建议对我没有用。

具体情况:

我在Chrome和Firefox中使用python manage.py runserver进行测试。

我刚开始接触这个Stripe应用,之前只是用django-stripe-payments的示例代码来入门,之后再根据我的具体需求进行调整。

我正在运行的测试案例是使用django-stripe-payments的标准ajax表单来更改存储的信用卡:

<form action="{% url 'payments_ajax_change_card' %}" data-stripe-key="{{ STRIPE_PUBLIC_KEY }}" class="form ajax" data-replace-closest=".change-card" method="POST">
    {% csrf_token %}
    <input name="stripe_token" type="hidden" />
    <a href="" class="btn btn-primary change-card">{% if request.user.customer.card_kind %}Change{% else %}Add{% endif %} Card</a>
</form>

在我的基础模板中有一些JavaScript代码,当选择“更改卡片”按钮时,它会调用并显示Stripe的表单以输入卡片信息。我认为这部分没有问题——我直接从这里复制过来的。

在这个功能的上方,我有以下代码:

<script src="{% static "js/jquery-1.9.1.min.js" %}"></script>
<script src="//checkout.stripe.com/v2/checkout.js"></script>

而在下面则是:

<script src="{% static "js/eldarion-ajax.min.js" %}"></script>

在返回token(以及随后的表单提交事件)后,执行以下视图代码:

@require_POST
@login_required
def change_card(request):
    try:
        customer = request.user.customer
        send_invoice = customer.card_fingerprint == ""
        customer.update_card(
            request.POST.get("stripe_token")
        )
        if send_invoice:
            customer.send_invoice()
        customer.retry_unpaid_invoices()
        data = {}
    except stripe.CardError, e:
        data = {"error": e.message}
    return _ajax_response(request, "payments/_change_card_form.html", **data)

再次强调……这都是django-stripe-payments的现成代码。接下来发生的就是之前提到的原始JSON数据。

1 个回答

0

好的,我解决了这个问题。结果发现确实是jQuery的问题。我在我的应用程序中引用了两个jQuery文件。当我去掉第二个文件,只保留上面提到的那个时,它就正常工作了!我的信用卡信息在页面上按预期更新了(虽然有点慢)。

因为我使用的是pinax框架,它自动包含了一个jQuery引用。至少这是为了Django调试工具栏所必需的。这部分内容在“base.html”文件中:

{% block script_base %}{% endblock %}

(“base.html”文件的位置是:pinax_theme_bootstrap/templates/theme_bootstrap)

幸运的是,base.html提供了一个可以覆盖的块,叫做“jquery_src”,所以在我应用的“site_base.html”文件中,我只需在底部添加以下内容:

{% block jquery_src %}{% endblock %}

这样就去掉了第二个jQuery库。

我还尝试使用jQuery v1.11.0,因为在我之前提到的这个问题中认为它可能有问题,结果也成功了。

撰写回答