【问题标题】:Django NoReverseMatch Error when passing arguments on redirect在重定向上传递参数时出现 Django NoReverseMatch 错误
【发布时间】:2017-11-15 03:03:56
【问题描述】:

您好,我试图从一个视图函数重定向到另一个视图函数并将列表列表作为参数传递。

urls.py

    urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'^checkFiles/', views.checkFiles, name='checkoutFiles'),
    url(r'^$', views.home, name='home'),
    url(r'^upload/', views.upload, name='upload'),
    url(r'^login', views.loginview, name='loginview'),
    url(r'^logout/', views.logoutview, name='logoutview'),
    url(r'^confirm_files/', views.upload, name='confirm_file'),
    url(r'^upload/', views.del_files, name='del_files'),

]

views.py

为了从views.upload重定向到views.checkoutFiles,我正在使用这个命令

return redirect(reverse('checkoutFiles', kwargs={'ACCEPTED_FILES':ACCEPTED_FILES}))

...

def checkFiles(request, ACCEPTED_FILES):
  print ACCEPTED_FILES
  return render(request, 'confirm_files.html', {
      'ACCEPTED_FILES': ACCEPTED_FILES
  })

我收到此错误消息

NoReverseMatch: Reverse for 'checkoutFiles' with keyword arguments '{'ACCEPTED_FILES': [[u't2_r0Oqwl7.txt', '0.98 KB', u'text/plain']]}' not found. 1 pattern(s) tried: ['checkFiles/']

django 版本:1.11.2

【问题讨论】:

    标签: python django redirect django-views django-reversion


    【解决方案1】:

    当你调用 reverse 时,Django 会遵循你在 urls.py 中的内容。在那里,您没有在checkoutFiles 的正则表达式中指定任何参数。例如:

    url(r'^articles/([0-9]{4})/$', views.year_archive, name='year-archive'),
    

    在这个例子中你可以调用:

    reverse('year-archive', args=[datetime.datetime.today().year])
    

    https://docs.djangoproject.com/en/1.11/topics/http/urls/#example

    在您的代码中,您必须指定您将在该 URL 中收到哪些参数。

    url(r'^checkFiles/(?P<extension>[\w]+)/$', views.checkFiles, name='checkoutFiles'),
    

    虽然通过 URL 进行这种验证并不是一个好主意。

    编辑#2

    如果你想在 URL 中加入一些东西,你可以使用 GET 参数:

    每当您重定向时,您都可以执行以下操作:

    return redirect(reverse('checkoutFiles') + '?files={}'.format(ACCEPTED_FILES))
    

    在您被重定向到的视图中,您可以使用

    request.GET.get('files', '')
    

    https://docs.djangoproject.com/en/1.11/ref/request-response/#django.http.HttpRequest.GET

    【讨论】:

    • 仍然有同样的错误...我正在尝试在不同的 url 上显示列表 'ACCEPTED_FILES' 的值。你建议我怎么做?提前致谢
    • 您可以使用GET 参数。每当您重定向时,您都可以执行以下操作:return redirect(reverse('checkoutFiles') + '?files={}'.format(ACCEPTED_FILES))。在您被重定向到的视图中,您可以使用request.GET.get('files', '') 获取值。
    • 你得到了错误,因为你的视图有不同的变量名。而不是extension 使用ACCEPTED_FILESurl(r'^checkFiles/(?P&lt;ACCEPTED_FILES&gt;[\w]+)/$', views.checkFiles, name='checkoutFiles'),
    • 我使用了 GET 选项并且工作正常!值得调试还是使用 GET 参数更好?哪一个是更好的解决方案(如果您有时间,请解释原因:P)?感谢您的宝贵时间!
    • 接受的文件是什么意思?它是在另一个视图中上传的文件的名称吗?他们的扩展?我仍然不明白你想用这个逻辑做什么。我的意思是这是一个坏主意,因为用户可以手动修改 GET 参数,您可能无法检查这些值是否为真。如果它解决了您遇到的错误,请记住将问题标记为正确。 :)
    【解决方案2】:

    你应该在你的项目 urls.py 文件和下面的代码中添加一个命名空间
    例子: 项目名称/urls.py

    url(r'^appname/', include('appname.urls', namespace='namespace')),
    

    views.py

     return redirect(reverse('namespace:checkoutFiles', kwargs={'ACCEPTED_FILES':ACCEPTED_FILES}))
    

    【讨论】:

    • 我只有一个应用程序,并且 url sn-p 属于项目 urls.py... 仍然没有修复。 tnx 为您解答
    • 你的 urls 模式不接受任何参数 url(r'^checkFiles/', views.checkFiles, name='checkoutFiles'),
    猜你喜欢
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-28
    • 2020-06-11
    • 1970-01-01
    • 2020-01-29
    相关资源
    最近更新 更多