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 请求的主要内容,如果未能解决你的问题,请参考以下文章