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

Posted

技术标签:

【中文标题】ajax请求返回django.urls.exceptions.NoReverseMatch后Django反向和重定向【英文标题】:Django reverse and redirect after ajax request returns django.urls.exceptions.NoReverseMatch 【发布时间】:2017-12-28 12:35:20 【问题描述】:

我从 ajaxajax 函数中调用一个特定的 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

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

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】:

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 的值为 1111foo 的值为 bar

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

向视图传递参数

因此,看看您要实现的目标:您希望将用户的浏览器重定向到不同的 URL,以便生成的视图可以访问 keywordselected 参数。

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

因此,在您的search_result 视图中,您可以将查询字符串添加到 URL,即。 ?keyword=...&amp;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')
    # ...

【讨论】:

感谢您的澄清,那么在这种情况下我应该怎么做才能将这些变量传递给另一个视图? @Mat 我已经更新了答案以包含一种可以实现您想要做的事情的方法。可能还有其他方法,最好的方法取决于您正在做什么的细节,但希望这足以向您展示一般是如何实现的。

以上是关于ajax请求返回django.urls.exceptions.NoReverseMatch后Django反向和重定向的主要内容,如果未能解决你的问题,请参考以下文章

ajax请求返回数据保存为全局变量

请问,使用ajax时,请求数据,如果返回为空,则继续请求,直到有结果,然后返回结果

Java中 用ajax发出请求返回JOSN格式数据,中文乱码问题

$.ajax()请求的返回的值怎样输出在一个div里???

ajax请求json数据返回啥类型

使用ajax发送异步请求,请求后端的控制层方法,并且获取这个方法返回的日期,然后显示在页面上?