Django-禁止CSRF令牌丢失或不正确:/ vote /

问题描述

我有一个网站,帖子上有AJAX上赞成或下赞成词的选项。 我遇到的问题是,投票只能在我的帖子详细信息页面上进行,而不能在我的索引页面上进行。我收到错误Forbidden (CSRF token missing or incorrect.): /Vote/

两个页面调用相同的视图和URL模式。

index.html:

{% for post in posts %}
    <span id="post_{{forloop.counter}}" data-value="{{post.id}}"></span>
    <button class="Vote_action" value="upVote_button"> + </i></button>
    
    <span id="Votes">{{post.points}}</span>
                                  
    <button class="Vote_action" value="downVote_button"> - </button>
{% endfor %}

<script type="text/javascript">
 // JQUERY - AJAX SCRIPT FOR voting
 $(document).ready(function(){
   {% for post in posts %}
   $('.Vote_action').click(function(e) {
      var postid = document.getElementById('post_{{forloop.counter}}').getAttribute('data-value');
          var button = $(this).attr("value");
          e.preventDefault();
          $.ajax({
            type: 'POST',url: '{% url "Vote" %}',data: {
              postid: postid,csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val(),action: 'postVote',button: button,},success: function(json){
              if (json.length < 1 || json == undefined) {
                //empty
              }
              document.getElementById("Votes").innerHTML = json['result']
            },error: function(xhr,errmsg,err) {}
          })
        })
        {% endfor %}
      })
      </script>

post_detail.html:

    <span id="Vote_id" data-value="{{post.id}}"></span>
    <button class="Vote_action" value="upVote_button"> + </i></button>
    <span id="Votes">{{post.points}}</span>                           
    <button class="Vote_action" value="downVote_button"> - </button>

    <script type="text/javascript">
       // JQUERY - AJAX SCRIPT FOR voting
       $(document).ready(function(){
          $('.Vote_action').click(function(e) {
              var postid = document.getElementById('Vote_id').getAttribute('data-value');
              var button = $(this).attr("value");
              e.preventDefault();
              $.ajax({
                type: 'POST',data: {
                  postid: postid,success: function(json){
                  if (json.length < 1 || json == undefined) {
                    //empty
                  }
                  document.getElementById("points").innerHTML = json['result']
                },err) {}
              })
            })
          })
        </script>

urls.py

urlpatterns = [
    path('Vote/',views.post_Vote,name='Vote' ),]

views.py

@login_required
def post_Vote(request):
    if request.POST.get('action') == 'postVote':
        # get @R_145_4045@ion from request about what item id it is
        id = int(request.POST.get('postid'))
        # And also which button was pressed
        button = request.POST.get('button')
        post = Posts.objects.get(id=id)

        if button == 'downVote_button':
            if not post.Voters.filter(id=request.user.id).exists():
                post.Voters.add(request.user)
                post.Votes +=1
                post.points -=2
                post.save()

        elif button == 'upVote_button':
            if not post.Voters.filter(id=request.user.id).exists():
                post.Voters.add(request.user)
                post.Votes +=1
                post.points +=2
                post.save()

        # return result
        post.refresh_from_db()
        result = post.points
        return JsonResponse({'result':result})
    pass

对不起,有史以来最长的帖子!我已尝试在可能的情况下缩减并保留必要的信息。 有人有什么想法吗?

解决方法

我现在似乎可以使用下面在另一个post上遇到的以下方法来工作。

在index.html中,我进行了更改:

csrfmiddlewaretoken: $('input[name=csrfmiddlewaretoken]').val(),

csrfmiddlewaretoken: '{{ csrf_token }}',

我不确定这是否是解决此问题的正确方法,并且必须等待该站点最终启用后才能正常工作。 欢迎任何意见。