0

我正在尝试使用 Django 向服务器发出简单的 POST 请求。我可以使用另一个 api 客户端进行 post 调用只是为了对其进行测试,但是在使用 jquery 时它永远不会返回任何内容或显示来自回调函数的警报。下面是我的 jquery 和 django 代码。我已经替换了 api 调用,但我知道它是正确的。

$(document).ready(function(){
  $("#signInSubmit").click(function(){
    alert("Posting email: "+$("#email").val()+" guests: "+$("#guests").val());
    $.post("apicall",
    {
      'email':$("#email").val(),
      'guests':$("#guests").val(),
      'event':"1"
    },
    function(data,status) {
               alert("Data: " + data + "\nStatus: " + status);
    });
  });
});

这是被击中的 django 视图:

@csrf_exempt
def participant_info(request):
    if request.method == 'GET':
        participant_email = request.GET.get('email')
        participant = Participant.objects.get(email = participant_email)

        #serialized_obj = serializers.serialize('json', [ participant, ])

        response = HttpResponse()
        response.content = serialized_obj = serializers.serialize('json', [ participant, ])
        response['Content-Type'] = 'application/json'
        return response

        #return HttpResponse(response, mimetype="application/json")

    if request.method == 'POST':
        participant_email = request.POST.get('email', '')
        numguests = request.POST.get('guests', '')
        eventid = request.POST.get('event', '')

        participantkey = Participant.objects.get(email = participant_email)
        eventkey = Event.objects.get(id=eventid)
        per = Participant_Event_Record(guests = numguests, event = eventkey, participant = participantkey)
        per.save()

        response = HttpResponse()
        response.content = serialized_obj = serializers.serialize('json', [ per, ])
        response['Content-Type'] = 'application/json'
        return response
4

2 回答 2

1

我认为可能发生了几件事:

  1. 在 jQuery 调用中指定内容类型,确保它显示“应用程序/json”(http://api.jquery.com/jQuery.ajax/),因为您正在序列化假设它是 JSON,但它默认为“应用程序/x” -www-form-urlencoded'。

  2. 您的 POST url 在其 URL 的末尾需要一个 /,并且您正在发布到没有 / 的端点,这使得 Django 发出重定向到 / URL。您可以通过设置 APPEND_SLASH 设置来禁用它(https://docs.djangoproject.com/en/1.4/ref/settings/#append-slash),但实际上最好始终在末尾使用“/”调用所有端点,所以我会说不要使用 $.post("apicall", ...) 发布,而是尝试 $.post("apicall/", ...) 看看是否有帮助。

否则,您可以发布尝试时遇到的错误吗?来自 Django 控制台和 Chrome 中的 Javascript 控制台?

于 2012-11-14T20:58:17.403 回答
0

原来它被包裹在我没有注意到的 HTML 正文中的一个表单中。删除表单包装后,它工作得很好。

于 2012-11-14T22:07:15.703 回答