2016-08-08 39 views
0

Ich kann keine POST Ajax Anfrage in Django machen. Wenn ich eine GET-Anfrage mache, funktioniert es gut. Ich denke, es kann ein csrf Token Problem sein, aber ich kann esAJAX POST funktioniert nicht in Django

Meine Ansicht zu arbeiten:

@login_required 
def add_share_points(request): 
    user = request.user 
    profile = request.user.profile 

    if request.method == 'POST': 
     value = 5.0 

     # Premia o usuário ao compartilhar conteúdo 
     VirtualCurrencyTransaction.objects.create(
      user=request.user, 
      reason=2, 
      description='Você completou seu perfil', 
      value=value 
     ) 

    return "ok" 

Meine AJAX Anfrage:

$('.my-button').on('click', function(e) { 
    e.preventDefault(); 
    var pointsCount = $(this).hasClass('homepage-facebook-share') ? 3 : 2; 
    $.ajax({ 
     type:"POST", 
     url: "/add_share_points", 
     data: { 
      points: pointsCount, 
     } 
    }).done(function() { 
     alert('Posting completed.'); 
    }).fail(function(){ 
     alert('Error while posting.'); 
    }); 
}); 

In meinem Skript, ich habe auch diese Einstellung:

function csrfSafeMethod(method) { 
    return (/^(GET|HEAD|OPTIONS|TRACE)$/).test(method); 
} 

$.ajaxSetup({ 
    crossDomain: false, 
    beforeSend: function(xhr, settings) { 
     if (!csrfSafeMethod(settings.type)) { 
      xhr.setRequestHeader('X-CSRFToken', CSRF_TOKEN); 
     } 
    } 
}); 

Was ist falsch an meinem Code? Es gab einen 500 Fehlercode, aber keine weitere Erklärung in den Protokollen.

+1

Aktivieren Sie den Debug-Modus oder konfigurieren Sie die Protokollierung und buchen Sie den vollständigen Stack-Trace. –

+0

Sie können in Ihrer View-Funktion keinen String '" ok "' zurückgeben, der mit einem Fehler fehlschlägt. Sie müssen [ein HttpResponse-Objekt zurückgeben] (https://docs.djangoproject.com/en/1.9/topics/http/views/#writing-views). – solarissmoke

+0

@solarissmoke, ich habe gerade getestet. Die POST-Anforderung gibt nicht einmal die Methode ein, wenn ich debuggen. –

Antwort

2

Ich werde einige Dinge zu korrigieren, einige sind nur Möglichkeiten, es in einer Django-Art und nicht Probleme zu tun.

Ihrer Ansicht

return HttpResponse(
      json.dumps({'result': 'ok',}), 
      content_type="application/json" 
     ) 

In Ihrem Ajax

url: "/add_share_points", 

sollte sein:

url : {% url '<name in url.py>' %}, 

und Sie müssen (auf das Datenobjekt) hinzufügen:

csrfmiddlewaretoken: '{{ csrf_token }}' 

Innerhalb der Ajax-Anforderung, fügen Sie diese nach Daten:

// handle a successful response 
success : function(json) { 
    if (json.result=== 'ok'){ 
     console.log('It works!'); 
    }else{ 
     console.log('Something wrong with response'); 
    } 
// handle a non-successful response 
error : function(xhr,errmsg,err) { 
    console.log(err); 
} 

In Ihrem Skript

statt CSRF_TOKEN Verwendung '{{ csrf_token }}'

Bitte meine Vorschläge verwenden und mir geben Feedback und ich werde die Antwort aktualisieren. Die beiden mit csfrtoken sind wahrscheinlich die Probleme, die Sie haben. Wenn du Django in den Debug-Modus bringst, wird es leichter, es herauszufinden.

Mein Vorschlag

ein form erstellen mit dem, was Sie brauchen, um zu Posten einiger Funktionen im Validierungsprozess zu gewinnen.

+0

Danke, ich werde diese versuchen. Eine Sache: {{csrf_token}} funktioniert in einer .js-Datei? –

+0

auch, in der Basis.htm Ich habe:

+0

Nein, tut es nicht. Mach 'Konsole.log', um zu verstehen, ob der Wert in der .js-Datei korrekt ist – NBajanca