ajax 调用 csrf 令牌的问题

Issue with ajax call csfr token

我正在尝试添加一个 ajax 调用来更改列表的状态,在列出和未列出之间,提交表单时我在浏览器的控制台中遇到 403 禁止错误,我做了一些检查,由于缺少 csrf 令牌,Django 似乎禁止使用该表单,但是我不擅长 javascript,因此我们将不胜感激。

这是我认为的代码:

@require_POST
@ajax_required
@login_required

def unlist_ajax(request):
    pk = request.POST.get('pk', None)
    is_visible = request.POST.get('is_visible', None)
    if pk and is_visible:
        listing = get_object_or_404(Listing, pk=pk)
        if is_visible == 'true':
                listing.is_visible = False
                listing.save()
                messages.success(request, _("Listing unlisted"))
                return JsonResponse({'status': 'ok'})

         else:
                listing.is_visible = True
                listing.save()
                messages.success(request, _("Listing re-listed"))
                return JsonResponse({'status':'ok'})

这是模板脚本:

在模板的顶部,在 header:

  <script>
 function unlistPostAjax(listing_id, is_visible) {
var confirmation = confirm("{% trans 'are you sure you want to change the status of your listing?' %}");
if (confirmation) {
$.post("{% url 'dashboard:unlist_ajax' %}", {pk: listing_id, is_visible: is_visible}, function (response) {
console.log('sending delete query'); location.reload();
})
}
}


    </script>

并在 body 的底部:

 <script src="{% static 'js/jquery.cookie.js' %}"> </script>
<script>
        $(document).ready(function () {
            var csrftoken = $.cookie('csrftoken');
            function csrfSafeMethod (method) {
                // These HTTP methods do not require CSRF protection
                return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
            }
            $.ajaxSetup({
                beforeSend: function (xhr, settings) {
                    if(!csrfSafeMethod(settings.type) && !this.crossDomain) {
                        // Set X-CSRFToken HTTP Header
                        xhr.setRequestHeader("X-CSRFToken", csrftoken);
                    }
                }
            });
        });
    </script>

您可以将它添加到 <script> 的顶部,或者如果您有基础 html 模板,您也可以将其添加到那里。

{% csrf_token %}
<script type="text/javascript">
var csrftoken = jQuery("[name=csrfmiddlewaretoken]").val();

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
            xhr.setRequestHeader("X-CSRFToken", csrftoken);
        }
    }
});
</script>

相信你只需要在你定义的脚本上面添加csrf,但这是我目前使用的整个实现。我没有问题。