Django - 发出 Ajax 请求

Posted

技术标签:

【中文标题】Django - 发出 Ajax 请求【英文标题】:Django - Making an Ajax request 【发布时间】: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"。如果我在正确的轨道上,你能看看吗? 【参考方案1】:

首先:您必须将模板划分为不可更改的部分和要使用过滤器修改的部分。

第二:为了你的目标,你可以使用 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 "% url 'name in yours url file'%" 成功后,您需要添加下一行:

success: function(data)
  $(".filter-block").html(data.html);

希望对你有帮助!祝你好运!

【讨论】:

以上是关于Django - 发出 Ajax 请求的主要内容,如果未能解决你的问题,请参考以下文章

12.Django与ajax

Django( Ajax )

如何使用带有 ajax 的 DJANGO REST 框架发出 POST 请求

Django 之Ajax

Django中的Ajax详解

Django与Ajax