ajax 请求 returns django.urls.exceptions.NoReverseMatch 后 Django 反向和重定向
Django reverse and redirect after ajax request returns django.urls.exceptions.NoReverseMatch
我从 url
和 ajax
函数中调用了一个特定的 url
函数,该函数将调用相应的视图函数。在视图函数中,我想通过调用另一个视图来重定向页面(因为在 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
但是在 consul 中我得到这个错误:
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
kwargs
参数到url
您为调用 url
提供的额外 kwargs
参数允许您定义额外的参数,然后将这些参数传递给视图。它们没有定义在获取 url 时提供的额外参数——对 reverse
的调用不知道这些额外参数,对 reverse
的调用只知道在url 模式。
所以如果你有:
urlpatterns = [
url(r'^blog/(?P<year>[0-9]{4})/$', myview,
kwargs={'foo': 'bar'}),
]
这意味着当您的 url 被提取为 blog/1111
时,视图 myview
将被调用,并带有两个参数:year
,值为 1111
和 foo
的值为 bar
.
只有视图可以看到额外的参数 foo
- 它不在 url 中,也没有提供给 reverse
函数。 reverse
函数的kwargs
参数实际上是指url模式中定义的参数。
向视图传递参数
那么看看您要实现的目标:您希望将用户的浏览器重定向到另一个 URL,这样生成的视图将可以访问 keyword
和 selected
参数。
如果您希望对用户隐藏该数据,则必须将其存储在会话中。假设情况并非如此,您可以通过三种方式将参数传递给视图:通过 GET 参数、通过 POST 数据和查看 url。在您重定向到另一个页面的情况下,您不能使用 POST 请求。您可以使用 url,但对于搜索页面,我认为最好的选择是使用 GET 参数。
因此,在您的 search_result
视图中,您可以将查询字符串添加到 URL 即。 ?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
视图将从请求中读取那些内容:
def new_search_result(request):
selected = request.GET.get('selected')
keyword = request.GET.get('keyword')
# ...
我从 url
和 ajax
函数中调用了一个特定的 url
函数,该函数将调用相应的视图函数。在视图函数中,我想通过调用另一个视图来重定向页面(因为在 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
但是在 consul 中我得到这个错误:
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
kwargs
参数到url
您为调用 url
提供的额外 kwargs
参数允许您定义额外的参数,然后将这些参数传递给视图。它们没有定义在获取 url 时提供的额外参数——对 reverse
的调用不知道这些额外参数,对 reverse
的调用只知道在url 模式。
所以如果你有:
urlpatterns = [
url(r'^blog/(?P<year>[0-9]{4})/$', myview,
kwargs={'foo': 'bar'}),
]
这意味着当您的 url 被提取为 blog/1111
时,视图 myview
将被调用,并带有两个参数:year
,值为 1111
和 foo
的值为 bar
.
只有视图可以看到额外的参数 foo
- 它不在 url 中,也没有提供给 reverse
函数。 reverse
函数的kwargs
参数实际上是指url模式中定义的参数。
向视图传递参数
那么看看您要实现的目标:您希望将用户的浏览器重定向到另一个 URL,这样生成的视图将可以访问 keyword
和 selected
参数。
如果您希望对用户隐藏该数据,则必须将其存储在会话中。假设情况并非如此,您可以通过三种方式将参数传递给视图:通过 GET 参数、通过 POST 数据和查看 url。在您重定向到另一个页面的情况下,您不能使用 POST 请求。您可以使用 url,但对于搜索页面,我认为最好的选择是使用 GET 参数。
因此,在您的 search_result
视图中,您可以将查询字符串添加到 URL 即。 ?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
视图将从请求中读取那些内容:
def new_search_result(request):
selected = request.GET.get('selected')
keyword = request.GET.get('keyword')
# ...