Ajang重定向后Django视图无法呈现

Bry*_*row 2 python django ajax 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'),
Run Code Online (Sandbox Code Playgroud)

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('')
Run Code Online (Sandbox Code Playgroud)

ett*_*any 12

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

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

以下是如何使用您的设置处理重定向,从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 })
Run Code Online (Sandbox Code Playgroud)

在JS中,您使用done(或success)函数从传回的URL中获取URL JsonResponse并使用window.location.href以下方法重定向到该URL :

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