Django AJAX JSON响应在浏览器中显示为原始文本
我正在使用Django(1.4.2)在Pinax框架中开发一个Stripe网页应用,使用了以下工具:
- django-stripe-payments
- 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 个回答
好的,我解决了这个问题。结果发现确实是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,因为在我之前提到的这个问题中认为它可能有问题,结果也成功了。