Django-发出Ajax请求

时间:2018-09-20 17:28:00

标签: ajax django django-rest-framework django-views django-urls

我很难弄清楚如何将此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)

Urls.py

path('pending/', views.pending_action, name='pending_action')

1 个答案:

答案 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);
}

我希望它将对您有所帮助!祝你好运!