在ajax请求返回django.urls.exceptions.NoReverseMatch之后,Django反向和重定向

时间:2017-07-22 13:07:54

标签: python ajax django django-urls

我调用了来自url函数的特定ajax,它将调用相应的视图函数。在视图函数中,我想通过调用另一个视图来重定向页面(因为我无法在ajax请求之后渲染)。

以下是我的网址:

urlpatterns = [
    url(r'^$', views.search, name='search'),
    url(r'^search_result/.+$', views.search_result, name='search_result'),
    url(r'^new_search_result/$',
        views.new_search_result,
        kwargs={'selected': '', 'keyword': ''},
        name='new_search_result')
]

以下是search_result视图:

@csrf_exempt
def search_result(request):
    keyword = request.POST.get('keyword')
    selected = request.POST.get('selected')
    url = reverse('new_search_result',
                  kwargs={'keyword': keyword,
                          'selected': selected})
    return HttpResponseRedirect(url)
    # return render(request, 'SearchEngine/search_result.html', {'all_results': result})

以下是new_search_result视图:

def new_search_result(request, selected={}, keyword=''):
   # code blocks

但是在领事中我得到了这个错误:

django.urls.exceptions.NoReverseMatch: Reverse for 'new_search_result' with keyword arguments '{'selected': '{"PANTHER":"ftp.pantherdb.org","Pasteur Insitute":"ftp.pasteur.fr","Rat Genome Database":"ftp.rgd.mcw.edu"}', 'keyword': 'dfasdf'}' not found. 1 pattern(s) tried: ['searchengine/new_search_result/$']
[22/Jul/2017 12:52:12] "POST /searchengine/search_result/dfasdf HTTP/1.1" 500 16814

1 个答案:

答案 0 :(得分:0)

kwargs的{​​{1}}参数

您为url调用提供的额外kwargs参数允许您定义额外的参数,然后将这些参数传递给视图。它们没有定义在获取url时提供的额外参数 - 对url的调用不知道这些额外的参数,对reverse的调用只知道url模式中定义的参数。 / p>

所以如果你有:

reverse

这意味着当您的网址被提取为urlpatterns = [ url(r'^blog/(?P<year>[0-9]{4})/$', myview, kwargs={'foo': 'bar'}), ] 时,会使用两个参数调用blog/1111myview的值为year1111的值为foo bar

只有视图才会看到额外的参数foo - 它不在url中,并且不会提供给reverse函数。 kwargs函数的reverse参数实际上是指url模式中定义的参数。

将参数传递给视图

因此,请查看您尝试实现的目标:您希望将用户的浏览器重定向到其他网址,以便生成的视图可以访问keyword和{{ 1}}参数。

如果您希望从用户隐藏数据,则必须将其存储在会话中。假设情况并非如此,您可以通过三种方式将参数传递给视图:通过GET参数,通过POST数据和查看网址。在您重定向到另一个页面的情况下,您无法使用POST请求。您可以使用网址,但对于搜索页面,我认为最好的选择是使用GET参数。

因此,在selected视图中,您可以向网址添加查询字符串,即。 search_result。例如:

?keyword=...&selected=...

您的import urllib @csrf_exempt def search_result(request): args = { 'keyword': request.POST.get('keyword'), 'selected': request.POST.get('selected') } url = '%s?%s' % ( reverse('new_search_result'), urllib.urlencode(args) ) return HttpResponseRedirect(url) 视图会从请求中读取这些视图:

new_search_result
相关问题