在Ajax重定向

时间:2016-12-21 22:54:35

标签: python ajax django redirect django-views

我网站的主页顶部有多个按钮。每当按下其中一个按钮时,就会向django视图发送一个get请求,该视图被重定向,并且django模型的查询集被过滤并最终显示在网页上。我知道我的ajax有效,因为终端说请求被正确重定向。它重定向的功能似乎也在起作用,因为它非常简单并且没有抛出任何错误。但是,我的看法仍然相同,我不知道为什么。

urls.py

url(r'ajax_filter/', views.ajax_filter, name='ajax_filter'),
url(r'filter=(\w+)/$', views.filtered_index, name='filtered_index'),

views.py

def filtered_index(request, filter):
    clothes = Clothes_Item.objects.filter(gender=filter)
    if request.user.is_authenticated():
        favorite_clothes_ids = get_favorite_clothes_ids(request)
        return render(request, 'test.html', {'clothes': clothes, 'favorite_clothes_ids': favorite_clothes_ids})
    else:
        return render(request, 'test.html', {'clothes': clothes, })

def ajax_filter(request):
    if request.is_ajax():
        gender_filter = request.GET.get('gender_filter') #filter type
        if gender_filter is not None:
            return HttpResponseRedirect(reverse('filtered_index', args=[gender_filter]))
    return HttpResponse('')

1 个答案:

答案 0 :(得分:11)

您不能在您的情况下使用Django重定向。当您发送ajax请求时,通常需要json响应,并且基于此,您可以通过JavaScript代码重定向用户。

$.ajax({
  // You send your request here
}).done(function(data) {
  // You can handle your redirection here
});

以下是如何使用您的设置处理重定向,您从django传回JsonResponse以及您要访问的下一页:

from django.http import JsonResponse

def ajax_filter(request):
    if request.is_ajax():
        gender_filter = request.GET.get('gender_filter') #filter type
        if gender_filter is not None:
            return JsonResponse({
                'success': True,
                'url': reverse('filtered_index', args=[gender_filter]),
            })
    return JsonResponse({ 'success': False })

在JS中,您使用完成(或成功)函数从传回的JsonResponse中获取URL并使用window.location.href重定向到该URL:

$.ajax({
  // You send your request here
}).done(function (data) {
    if (data.success) {
        window.location.href = data.url;
    }    
});