2017-01-11 1 views
0

Also in meinem django app zu kommentieren, ich versuche, Ajax zu machen, und ich habe das angetroffen:

Forbidden (CSRF token missing or incorrect.): /app/437/ 

Fehler. Nach dem durch viele Lese SO beantwortet sie die am häufigsten verwendete und einfache Methode, mit diesem Fehler, indem sie durch die csrf Token ist durch $ Schnipsel() Daten wie diese zu behandeln scheint:

$('.comment_form').on('submit', function(e) { 
e.preventDefault(); 

var url = window.location.href.split('?')[0]; 
    console.log(url) 

$.ajax({ 
    type: 'POST', 
    url: url, 
    data: { 
     text: $('.comment_text').val(), 
     'csrfmiddlewaretoken': '{{csrf_token}}', 
     }, 
    success: function() { 
     $('.comment_div').append("<div class='comment_div'><h3>username</h3><p>" + text + "</p></div>"); 
     console.log(text); 
    } 
}) 
}); 

Hier ist meine Vorlage, wenn Sie neugierig:

{% block comments %} 
{% load widget_tweaks %} 

<div class="commentsContainer"> 

    <form action="" class="comment_form">{{csrf_token}} 
     {{ comment.comment_text|add_class:"comment_text" }} <!-- this is a textarea--> 
     <input type="submit" value="Comment" class="comment_submit"> 
    </form> 
    <div class="comment_div"> 
     <h3>username1</h3> 
     <p>Some text</p> 
    </div> 
</div> 

{% endblock %} 

Hier ist meine Ansicht:

def article(request, category, id): 

    name = resolve(request.path).kwargs['category'] 
    for a, b in CATEGORY_CHOICES: 
     if b == name: 
      name = a 
      instance = get_object_or_404(Post, id=id, category=name) 

    allauth_login = LoginForm(request.POST or None) 
    allauth_signup = SignupForm(request.POST or None) 
    comment = CommentForm(request.POST or None) 

    context = { 
     'comment': comment, 
     'instance': instance, 
     'allauth_login': allauth_login, 
     'allauth_signup': allauth_signup 
    } 


    return render(request, 'article.html', context) 
+0

Sie haben Ihre Ansicht nicht angezeigt, so können wir nicht sagen, ob das Problem dort sein könnte. [Die Dokumente] (https://docs.djangoproject.com/en/1.10/ref/csrf/#ajax) beschreiben, wie Sie eine Kopfzeile für alle Ajax-Anforderungen festlegen können, sodass Sie das Token nicht manuell hinzufügen müssen zu den Post-Daten, wie Sie es versuchen. Für Nicht-Ajax-Anfragen sollten Sie '{% csrf_token%}' im '' -Tag haben, nicht '{{csrf_token}}'. – Alasdair

+0

Die Ansichten hinzugefügt. Und ist das nicht eine Ajax-Anfrage? Deshalb habe ich es von '{% csrf_token%}' auf '{{csrf_token}}' – Zorgan

+0

Wenn Sie ändern '{{csrf_token}}' auf '{% csrf_token%}' dann den versteckten Eingang in Ihrem '

' Tag , dann wird die versteckte Eingabe korrekt gerendert. Dies würde für Nicht-Ajax-Anfragen funktionieren (z.B. wenn JavaScript deaktiviert ist). – Alasdair

Antwort

1

Sie müssen {% csrf_token %} in Ihrem <form> verwenden; es wird eine versteckte Eingabe rendern, die einen Namen und einen Wert hat. Dann wird in den Daten des Ajax, sollten Sie, dass die Eingabe schicken Wert, wie folgt aus:

... 
data: { 
    text: $('.comment_text').val(), 
    csrfmiddlewaretoken: $("input[name='csrfmiddlewaretoken']").val(), 
}, 
... 
0

ich glaube, Ihre Header so aussehen müssen:

headers: { 
    'X-CSRFToken': "{{ csrf_token }}" 
} 

Auch in Ihrer Form, sollten Sie {% csrf_token %} verwenden, anstatt {{ csrf_token }}

Schauen Sie sich die Dokumentation für Informationen zu dieser. https://docs.djangoproject.com/en/1.10/ref/csrf/#ajax

+0

Ich schaute auf die Dokumentation und versuchte, diese Funktion getCookie() zu meiner .js-Datei hinzuzufügen. Aber was geht in die Vorlage und wohin geht es in der Vorlage? – Zorgan

+0

Sie müssen die 'getCookie()' Funktion und 'var csrftoken = getCookie ('csrftoken') hinzuzufügen;' Zeile in der Skript-Tag, sowie die 'csrfSafeMethod' Funktion und' $ .ajaxSetup ({...}) 'vom nächsten Codeblock in den Dokumenten. Dann können Sie die Zeile "csrfmiddlewaretoken": "{{csrf_token}}", "Zeile aus Ihren' Daten "entfernen. – Alasdair

+0

Auf dem tatsächlichen 'Skript'-Tag? Also, wie würde es hier aussehen? ' ' – Zorgan