Javascript 在CBV中使用复选框实现Django Ajax Post请求

Javascript 在CBV中使用复选框实现Django Ajax Post请求,javascript,python,jquery,django,ajax,Javascript,Python,Jquery,Django,Ajax,我试图通过使用复选框(而不是表单)向服务器发送ajax post请求来添加或删除对象。下面是我从视觉上看到的屏幕截图: 当我点击任何复选框时,我得到了http500(内部服务器错误)作为响应。在cmd中,我看到一个错误,该错误表示没有匹配查询:app1.models.Influencer.DoesNotExist:Influencer匹配查询不存在。 问题是我非常确定数据库中存在具有该id的对象。我花了很多时间查看Django的CSRF文档,并观看关于Django ajax示例的youtube

我试图通过使用复选框(而不是表单)向服务器发送ajax post请求来添加或删除对象。下面是我从视觉上看到的屏幕截图:

当我点击任何复选框时,我得到了http500(内部服务器错误)作为响应。在cmd中,我看到一个错误,该错误表示没有匹配查询:app1.models.Influencer.DoesNotExist:Influencer匹配查询不存在。

问题是我非常确定数据库中存在具有该id的对象。我花了很多时间查看Django的CSRF文档,并观看关于Django ajax示例的youtube视频。这是我的密码:

视图.py

class InfluencerListView(LoginRequiredMixin, ListView):
    model = Influencer
    context_object_name = 'influencers' # not necessary, default is object_list

    def post(self, request, *args, **kwargs):
        inf_id = request.POST.get('inf.id')
        list_id = request.POST.get('list.id')
        i = Influencer.objects.get(id=inf_id)
        l = InfluencerList.objects.get(id=list_id)
        l.influencers.add(i)
        data = {
                'result' : 'some result'
        }
        return JsonResponse(data)     

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        logged_in_user = self.request.user
        context['myLists'] = logged_in_user.lists.annotate(influencers_count=Count('influencers'))
        return context
型号。py:

class Influencer(models.Model):
    # fields are not included for the sake of clarity

class InfluencerList(models.Model):
    name = models.CharField('Name:', max_length=20, blank=False)
    owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='lists')
    influencers = models.ManyToManyField('Influencer', related_name='lists') 
scripts.js

function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = cookies[i].trim();
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}

function myFunc(_self) {
    inf_id = _self.getAttribute('data-inf_id');
    list_id = _self.getAttribute('data-list_id');
    console.log(inf_id + " " + list_id); # I CAN SEE THOSE  IDS IN CONSOLE AND THEY EXIST IN DB
    var csrftoken = getCookie('csrftoken');
    if(_self.checked == true){
        console.log("checked!");

        $.ajaxSetup({
            beforeSend: function(xhr, settings) {
                if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                    xhr.setRequestHeader("X-CSRFToken", csrftoken);
                }
            }
        });

        $.ajax({
            method: 'POST',
            url: '/influencers',
            data: {
                'inf_id': inf_id,
                'list_id': list_id,
                'csrfmiddlewaretoken': csrftoken
            },
            dataType: 'json',
            success: function (data) {
                console.log("succes!");
            }
        });
    }
    else{
         console.log("unchecked!");       
    }
}
函数getCookie(名称){ var-cookieValue=null; if(document.cookie&&document.cookie!=''){ var cookies=document.cookie.split(“;”); 对于(变量i=0;i 我还在我的视图文件的某个地方添加了这一行(我把它放在哪里并不重要,只要它在正文中,因为我没有使用任何表单。如果我错了,请纠正我):



这不是
request.POST.get('inf\u id')
而不是
request.POST.get('inf.id')
?@Willem我想我得睡一觉了。。。再次感谢:)这不是
request.POST.get('inf\u id')
而不是
request.POST.get('inf.id')
?@Willem我想我必须睡一觉了。。。再次感谢:)
<input type='hidden' name='csrfmiddlewaretoken' value='{{ csrf_token }}' />