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

时间:2014-05-06 12:21:52

标签: javascript python ajax json django

我正在Pinax框架内使用Django(1.4.2)开发Stripe webapp并使用:

  1. django的条纹支付
  2. 艾达瑞安-AJAX
  3. 除非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"}
    

    This SO question似乎是相似的,但没有正式答案,提交者似乎已经弄明白了(通过评论),但这些建议对我不起作用。

    详细说明:

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

    我刚刚开始使用条纹应用程序,刚刚使用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被调用并显示条带形式以输入卡片详细信息 - 选择“更改卡片”按钮时。我不认为这是错误的 - 我直接从here

    我上面有以下功能:

    <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>
    

    在返回令牌(以及后续表单提交事件)之后,将执行以下视图代码:

    @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-payment代码。接下来发生的事情是如上所述的原始JSON。

1 个答案:

答案 0 :(得分:0)

好的,我解决了。事实证明这确实是一个jQuery问题。我在我的应用程序中引用了两个jQuery文件。当我删除第二个,并坚持上面问题中提到的那个,它工作了!我的信用卡详细信息在页面上按预期更新(尽管速度很慢)。

因为我使用的是pinax框架,所以它会自动附带一个jquery引用。它至少是Django调试工具栏所必需的。这包含在&#34; base.html&#34;文件里面:

{% block script_base %}{% endblock %}

(&#34; base.html&#34;位于此处:pinax_theme_bootstrap / templates / theme_bootstrap)

幸运的是,base.html提供了一个名为&#34; jquery_src&#34;的over-ridable块,所以在我的&#34; site_base.html&#34;在我的应用程序文件中,我刚刚在底部输入了以下内容:

{% block jquery_src %}{% endblock %}

这删除了第二个jQuery库。

我也尝试过使用jQuery v1.11.0,这被认为是this SO question I mentioned earlier中的错误,它也有效。