我正在尝试构建一个像按钮一样的ajax,但是ajax代码无法正常工作。
views.py
def like_button(request,postid):
postresult=get_object_or_404(post,id=postid)
if postresult.user_like.filter(id=request.user.id).exists():
postresult.user_like.remove(request.user)
else:
postresult.user_like.add(request.user)
noresdat=postresult.totallikes
response_data_to_dump={'success': True,'likes':noresdat}
data = json.dumps(response_data_to_dump)
return HttpResponse(data, content_type='application/json')
而模板如下:-
{% for p in result %}
<div class="SpriteContainer">
<a class="postlike" href="/like/{{ p.id }}"><img src="{%static "/images/icons/heart.png" %}"/></a>
<p class="nolike" style="display: inline-block;">{{ p.totallikes }}</p></div>
{% endfor %}
<script>
var csrftoken = $("[name=csrfmiddlewaretoken]").val();
$(".postlike").click(function(e){
e.preventDefault();
var $this = $(this);
var url = $(this).data("action");
$.post(url, function(response){
if(response && response.success==true)
$this.next(".nolike").text(response.likes);
});
});
答案 0 :(得分:0)
CSRF中间件和模板标记可提供易于使用的保护,以防止跨站点请求伪造。(Django)。
并且默认情况下,在MIDDLEWARE设置中激活了CSRF中间件。因此,您要么必须提供csrf令牌,要么必须从CSRF中豁免该视图。 视图基于类或函数。 由于您使用的是基于函数的视图,因此可以利用[csrf_exempt]。page
from django.views.decorators.csrf import csrf_exempt,
@csrf_exempt
def like_button(request,postid):
答案 1 :(得分:0)
现在,您没有随请求发送令牌值。
您应该在发布请求数据中发送csrf_token,以便django可以检查其值。
试试这个-
{% for p in result %}
<div class="SpriteContainer">
<a class="postlike" href="/like/{{ p.id }}"><img src="{%static "/images/icons/heart.png" %}"/></a>
<p class="nolike" style="display: inline-block;">{{ p.totallikes }}</p></div>
{% endfor %}
{% csrf_token %} <!-- getting csrf token value in html page -->
<script>
var csrftoken = $("[name=csrfmiddlewaretoken]").val();
$(".postlike").click(function(e){
e.preventDefault();
var $this = $(this);
var url = $(this).data("action");
$.post(url, {csrfmiddlewaretoken: csrftoken}, function(response){ // send csrf in post request data
if(response && response.success==true)
$this.next(".nolike").text(response.likes);
});
});
使用csrf_exempt通常被认为是一个坏主意,应谨慎使用此解决方法,因为它会使您的网站面临潜在的安全风险。