【发布时间】:2019-02-25 01:46:28
【问题描述】:
我很难弄清楚如何将此 ajax 请求集成到我的视图中。我仍在学习如何将 django 与 ajax 请求集成。
我的第一个问题是:ajax 请求是否需要有自己的专用 URL?
在我的例子中,我试图在一个按钮上调用它来执行过滤器(根据模板中选择的内容执行查询)。我只使用 django 实现了这一点,但每次用户执行我知道效率不高的过滤器时,它都需要发出新请求。
我使用 JQuery 编写了最基本的函数来确保通信存在。每当用户更改选择框中的选项时,它都会将值打印到控制台。正如您将在下面的视图中看到的那样,我将在此视图函数中调用 ajax 请求,如果这是可能的或正确的方法。
JQuery - 更新
$("#temp").change( function(event) {
var filtered = $(this).val();
console.log($(this).val());
$.ajax({
url : "http://127.0.0.1:8000/req/ajax/",
type : "GET",
data : {
'filtered': filtered
},
dataType: 'json',
success: function(data){
console.log(data)
},
error: function(xhr, errmsg, err){
console.log("error")
console.log(error_data)
}
});
Views.py
>def pending_action(request):
requisition_status = ['All', 'Created', 'For Assistance', 'Assistance Complete', 'Assistance Rejected']
FA_status = RequisitionStatus.objects.get(status='For Assistance')
current_status = 'All'
status_list = []
all_status = RequisitionStatus.objects.all()
status_list = [status.status for status in all_status]
# This is where I am handling the filtering currently
if request.GET.get('Filter') in status_list:
user_req_lines_incomplete = RequisitionLine.objects.filter(Q(parent_req__username=request.user) & Q(status__status=request.GET.get('Filter')))
current_status = request.GET.get('Filter')
else:
user_req_lines_incomplete = RequisitionLine.objects.filter(parent_req__username=request.user).exclude(status__status='Completed')
user_reqs = Requisition.objects.filter(par_req_line__in=user_req_lines_incomplete).annotate(aggregated_price=Sum('par_req_line__total_price'),
header_status=Max('par_req_line__status__rating'))
return render(request, 'req/pending_action.html', { 'user_reqs':user_reqs,
'user_req_lines_incomplete':user_req_lines_incomplete,
'requisition_status':requisition_status,
'current_status':current_status,
'FA_status':FA_status})
def filter_status(request):
status = request.GET.get('Filter')
data = {
'filtered': RequisitionLine.objects.filter(Q(parent_req__username=request.user) & Q(status__status=status)),
'current_status': status
}
return JsonResponse(data)
网址.py
>path('pending/', views.pending_action, name='pending_action')
【问题讨论】:
-
您的视图返回一个 HTML 文档(因为它呈现一个 HTML 模板),而您可能希望 ajax 请求调用的视图返回一个仅包含所需变量的 JSON 文档。根据请求的内容类型,可以编写一个返回 HTML 和 JSON 的视图,但通常,由于请求完全不同,您应该在不同的 URL 处使用不同的视图(例如
/api/v1.0/req/pending/)。您可以创建两个视图都使用的通用函数以避免代码重复。 -
@dirkgroten 我相信我理解。基本上我将不得不删除上面代码中的 GET 请求部分,因为这将在一个返回 JSON 响应的新函数中处理。上面的视图函数仅用于初始呈现页面。
-
正确,除非您希望人们能够到达预先过滤的初始页面(例如 /req/pending/?Filter=For%20Assistance),并在页面上更改一次过滤器。这取决于您的网站中是否有指向预过滤页面的链接。然后我会在两个视图使用的单独函数中进行过滤。
-
请注意,您的 javascript 代码必须就地更改 DOM:删除/添加需要显示的元素。
-
@dirkgroten 我对代码进行了一些更新,但没有运气。我什至无法再显示我的控制台输出。我在模板中为
select标签中的选项设置了id="temp"。如果我在正确的轨道上,你能看看吗?
标签: ajax django django-rest-framework django-views django-urls