所以我试图在我的django应用程序中进行ajax评论,并且我遇到了:
Forbidden (CSRF token missing or incorrect.): /app/437/
错误。通过阅读许多SO答案后,似乎最常用和简单的方法来处理此错误是通过$ .ajax()数据传递csrf令牌,如下所示:
$('.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);
}
})
});
如果你有点好奇,请点击这里的模板:
{% 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 %}
以下是我的观点:
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 :(得分:1)
您必须在{% csrf_token %}
内使用<form>
;它将呈现一个隐藏的输入,它具有名称和值。然后,在ajax的数据中,您应该发送该输入的值,如下所示:
...
data: {
text: $('.comment_text').val(),
csrfmiddlewaretoken: $("input[name='csrfmiddlewaretoken']").val(),
},
...
答案 1 :(得分:0)
我相信你的标题需要看起来像这样:
q?˜?œ‹–74˜“›Ÿ?JsnJJJJ
另外,在您的表单中,您应该使用headers: {
'X-CSRFToken': "{{ csrf_token }}"
}
而不是{% csrf_token %}
查看文档了解相关信息。 https://docs.djangoproject.com/en/1.10/ref/csrf/#ajax