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)
}
}
})
});
我有一个问题,我不知道我是否使用好的方法来解决它,但他们就是问题所在,我有一个客户列表,我在客户页面上显示,通过简单的
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)
}
}
})
});