【问题标题】:Redirect with parameters. NoReverseMatch at /test/使用参数重定向。 /test/ 处的 NoReverseMatch
【发布时间】:2013-07-18 07:58:27
【问题描述】:

views.py:

def demo(request, **kwargs):
    print response
    ......

def test(request):
    ......
    kwargs = {'response': response}
    return redirect('demo', **kwargs)

urls.py:

from django.conf.urls import patterns, url
from django.contrib.sitemaps.views import sitemap


urlpatterns = patterns('clients.views',
    url(r'^test/', 'test', name='test'),
    url(r'^demo/', 'demo', name='demo'),

)

为什么会出现这个错误:

/test/ 处的 NoReverseMatch

使用参数 '()' 和关键字参数的 'demo' 反转 '{'response': {u'status': u'ok'}}' 未找到。

请求方法:POST 请求网址:http://127.0.0.1:8000/test/

【问题讨论】:

  • return redirect('demo')
  • @falsetru 为什么?我需要在我的demo 视图中访问response。如何添加参数?
  • 首先,响应变量确实存在于您的演示视图中(使用 kwargs.get('response'))。那你用的是哪个版本的Django?
  • 您是否尝试过从 shell 中反转它?

标签: django


【解决方案1】:

当使用redirect() 快捷方式时,您实际上是在执行HttpResponseRedirect(),因此需要在您的kwargs 中包含响应。

此外,如果您想使用关键字参数重定向,那么调用将是

redirect('/myurl/', momma="im comin' home")

redirect('/myurl/', kwargs={'loads_a_kwargs':'cowboy'})

您遇到的错误是因为您的正则表达式url(r'^demo/', 'demo', name='demo') 接受任何参数。此外,通常您会以 $ 结束所有 url 正则表达式,以表示应该停止捕获。

【讨论】:

  • 如何更正我的 url 正则表达式以接受来自 redirect('/myurl/', kwargs={'loads_a_kwargs':'cowboy'}) 的参数?
  • url(r'^demo/(?P<loads_a_kwargs>\w+)/$', 'demo', name='demo') 并且不要忘记使用def demo(loads_a_kwargs, request): 更新您的demo 视图
【解决方案2】:

这个错误不是从您的test 视图而是从您的demo 视图引发的。按照url反向匹配..demo url必须匹配demo view函数参数。

例如:网址:demo/ 应该是demo/<response>

如果您不想更改 url 模式,请以 GET 参数的形式回复 demo 视图。

【讨论】:

    【解决方案3】:

    当您说 redirect('demo', **kwargs) 时,它在内部尝试查找 urlpattern demo/(?P<response>\d+)。实际上它可能是\d+\w+ 或其他。但是你没有定义这个 urlpattern,所以它失败了。

    因此,如果您定义这样的 url 模式,它将通过。但是您的代码的另一个问题是 kwargs 中的 response 是一个字典,您无法在 url 模式中捕获字典。

    您有什么特别的原因想要与status 代码一起重定向到演示?

    【讨论】:

      【解决方案4】:

      NoReverseMatch Exception 当您的 URLconf 中的匹配 URL 无法根据您提供的参数识别时发生。参考django文档https://docs.djangoproject.com/en/dev/ref/exceptions/#noreversematch

      我在看你的url.py你没有包括$

      url(r'^test/$', 'test', name='test'),

      【讨论】:

        猜你喜欢
        • 2016-07-24
        • 2021-09-28
        • 2016-04-30
        • 2017-11-15
        • 1970-01-01
        • 1970-01-01
        • 2017-10-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多