Django 使用 GET ajax 调用按钮单击获取特定的 QuerySet

Django get specific QuerySet with GET ajax Call on button click

我有一个问题,我不知道我是否使用好的方法来解决它,但他们就是问题所在,我有一个客户列表,我在客户页面上显示,通过简单的

clients = client.objects.all()

所以所有的客户端都可以有很多会话,会话有很多客户端,就像多对多关系,所以我试着通过点击一个按钮来一个一个地显示客户端的分配会话(按钮打开一个 boostrap 模式),所以我尝试在点击时发送所选客户端的 ID,并使用 ajax GET 方法将其发送到 django 视图中,并直接获取此 ID 以查找与相关的所有会话此客户端和 return 对此页面的查询,因此 ajax 工作正常,我可以发送 ID,但它就像视图一样,它没有发送任何内容。所以他们是我的代码希望你能帮助我:

Html(div 我在 forloop 客户端上插入):

<div class="list-group list-group-me">
<ul class="list-group list-group-horizontal">
<li class="list-group-item">{{ client.name }}</li> 
<li class="list-group-item">{{ client.email }}</li>
<li class="list-group-item">{{ client.created_at | date:" M Y" }}</li>
<li class="list-group-item list-group-item-success">Active</li>
<li class="list-group-item">025f55azg5</li> 
<li><div class="btn-group">
  
   <button type="button" class="btn btn-primary" data-toggle="modal" data-target="#exampleModal" id="AddSession"
   data-id="{{ client.id }}">
Add
</button>
  <button type="button" class="btn btn-primary" data-id="{{ client.id }}" >View</button>
</div>
  </li>
</ul>
</div>

视图(尝试 .all() 只是为了看看它是否有效):

class show_session(View):

def get(self, request , id):
    Sclient = session.objects.all()
    #Sclient = session.objects.filter(client__id=id)
    context = { 'Sclient': Sclient }

    

    return render(request, 'coach/addclient.html', { 'Sclient': Sclient })

model.py :

class session(models.Model):
   name = models.CharField(max_length=80)
   client = models.ManyToManyField(client, blank=True)
   coach = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
   created_at = models.DateTimeField(auto_now_add=True)
   detail = models.CharField(max_length=256)

   def __str__(self):
      return self.name

页面主视图:

def addclient(request):
form = ClientForm
clients = client.objects.filter(affiliation=request.user.id)
Csession = session.objects.filter(coach=request.user.id)

context = {'form': form ,'clients': clients , 'Csession' : Csession}

form = ClientForm()
if request.method == 'POST':
    form = ClientForm(request.POST)
    print(form)

    if form.is_valid():
        print('adding client 1133', form)
        name = request.POST.get('name')
        email = request.POST.get('email')
        new_client = client.objects.create(name= name, email=email , affiliation=request.user)
        new_client.save()
        return JsonResponse({'client': model_to_dict(new_client)}, status=200)
    else:
        print('not adding client to the form 1333')
        return redirect('addclient')


return render(request, 'coach/addclient.html', context= context)

和ajax函数:

$("#AddSession").click(function(){


    var dataID = $(this).data('id');
    console.log(dataID)
    $.ajax({
    
        url:'addclient/'+ dataID +'/added',
        data: {
        csrfmiddlewaretoken: csrfToken,
        id: dataID
        },
        type : "get",

        success: function(response) {
            
            console.log("hey hey session over here");
 }

    })

});

我不知道是否可以只使用主视图来获取数据并显示它,当我尝试访问 show_session.view 的 url 时,查询集正在工作,但我仍然尝试在 addclient 上显示它 url 感谢您的宝贵时间和帮助!

所以我已经解决了这个问题,我刚刚使用 POST 方法将当前用户的 ID 发送到视图,然后我使用操作数据属性来处理我的多个 post查看并使用 ajax 给出的 id 以获得正确的查询集并将查询集序列化为 JSON 对象,因此 ajax 可以添加与所选客户端相关联的会话,单击它们是代码: 查看 :

    if request.method == 'POST' and request.POST['action'] == 'session':
    print("session response")
    id = request.POST.get('id')
    print(id)
    #Sclient = list(session.objects.filter(coach=request.user.id))
    Sclient = session.objects.filter(client__id=id)

    SerializedQuery = serializers.serialize('json', Sclient)
    return JsonResponse(SerializedQuery, safe=False)

Ajax :

$("#AddSession").click(function(){


    var dataID = $(this).data('id');
    
    $.ajax({
    
        url: $(this).data('url'),
        data: {
        csrfmiddlewaretoken: csrfToken,
        id: dataID,
        action: 'session',
        //dataType:"json"
        },
        type : "post",

        success: function(response) {
            
            console.log("hey hey session over here");
            console.log(response)
            var obj = jQuery.parseJSON(response)
            //console.log(obj[1].fields.name)

            var Sarray = [];
            var Selector = $("#assigned");
            var count = $("#assigned span")

            console.log(count.length)

        //used to limit the number of element on div on first click
        
        if(count.length < obj.length)   
        {
            for (i = 0 ; i < obj.length ; i++) {
                // console.log(obj[i].fields.name)
                 Sarray.push(obj[i].fields.name)
                 Selector.append('<a href="#"><span class="badge badge-success">'+ obj[i].fields.name +' x </span></a>')
                }

                console.log("yoow",Sarray.length)
        }
            
 }

    })

});