我很难弄清楚如何将此ajax请求集成到我的视图中。我仍在学习如何将Django与Ajax请求集成在一起。
我的第一个问题是:ajax请求是否需要具有自己的专用URL?
就我而言,我试图在按钮上调用它以执行过滤器(根据模板中选择的内容执行查询)。我仅使用django实现了此功能,但每次用户执行我知道效率不高的过滤器时,它都需要发出新请求。
我使用JQuery编写了最基本的函数,以确保通信存在。每当用户更改选择框中的选项时,都会将值打印到控制台。正如您将在视图下面看到的那样,如果可能或执行该方法的正确方式,我将在此视图函数内调用ajax请求。
$("#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)
}
});
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)
path('pending/', views.pending_action, name='pending_action')
答案 0 :(得分:0)
首先:您必须将模板分为不可更改的部分和要使用过滤器修改的部分。
第二:对于您的目标,您可以使用render_to_string。请参阅以下链接https://docs.djangoproject.com/en/2.1/topics/templates/#usage
代码示例(views.py):
cont = {
'request': request, #important key-value
'your_models_instances': your_models_instances
}
html = render_to_string('your_filter_template.html', cont)
return_dict = {'html': html}
return JsonResponse(return_dict)
在您的js文件中,您需要确定相对网址“ {%url'您的网址文件中的名称'%}” 成功后,您需要添加下一行:
success: function(data){
$(".filter-block").html(data.html);
}
我希望它将对您有所帮助!祝你好运!