Django - 找不到''的反向路径。''不是一个有效的视图函数或模式名称。

87
我正在为一门课程做我的项目,目前完全卡住了。我正在创建一个通过PayPal销售产品的网站,但是PayPal的返回/取消页面无法正确显示。我已经按照课程中的示例进行了操作,并且检查了代码一百次,但显然我漏掉了什么。
当我进入产品页面,点击立即购买,登录到PayPal,然后取消购买或购买产品并返回商家页面时,出现了一个错误。 paypal_return.html和paypal_cancel.html是两个保存在templates/paypal/目录下的模板文件。
有人能看出我漏掉了什么吗?
在这里你可以看到完整的代码 https://github.com/IreneG5/spss_online Traceback
环境:
Request Method: GET
Request URL: http://127.0.0.1:8000/paypal-cancel/

Django Version: 1.11.4
Python Version: 2.7.12

已安装的应用程序:
['django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'django_forms_bootstrap',
 'paypal.standard.ipn',
 'home',
 'accounts',
 'paypal_store',
 'products']

已安装的中间件:
['django.middleware.security.SecurityMiddleware',
 'django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware']

模板错误:
In template C:\Users\irene\Documents\Full-Stack-Developer\Stream3\Project\spss_online\templates\base.html, error at line 10
   Reverse for '' not found. '' is not a valid view function or pattern name.   1 : {% load staticfiles %}
   2 : <!DOCTYPE html>
   3 : <html lang="en">
   4 : <head>
   5 :     <meta charset="UTF-8">
   6 :     <title>Buy SPSS Online</title>
   7 :     <meta name="viewport" content="width=device-width, initial-scale=1.0">
   8 :     <meta name="description" content="">
   9 :     <meta name="author" content="">
   10 :     <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bootswatch/3.3.7/cerulean/bootstrap.min.css">
   11 :     <link rel="stylesheet" href="{% static 'css/style.css' %}">
   12 : 
   13 : 
   14 : </head>
   15 : <body>
   16 : <div class="container">
   17 :     <div class='container-fluid'>
   18 :         <nav id="menu" class="navbar navbar-inverse">
   19 :             <button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#myNavbar">
   20 :                 <span class="icon-bar"></span>

追踪:
File "C:\Users\irene\virtualenv\spss_online_env\lib\site-packages\django\core\handlers\exception.py" in inner
  41.             response = get_response(request)

File "C:\Users\irene\virtualenv\spss_online_env\lib\site-packages\django\core\handlers\base.py" in _get_response
  187.                 response = self.process_exception_by_middleware(e, request)

File "C:\Users\irene\virtualenv\spss_online_env\lib\site-packages\django\core\handlers\base.py" in _get_response
  185.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "C:\Users\irene\Documents\Full-Stack-Developer\Stream3\Project\spss_online\paypal_store\views.py" in paypal_cancel
  15.     return render(request, 'paypal/paypal_cancel.html', args)

File "C:\Users\irene\virtualenv\spss_online_env\lib\site-packages\django\shortcuts.py" in render
  30.     content = loader.render_to_string(template_name, context, request, using=using)

File "C:\Users\irene\virtualenv\spss_online_env\lib\site-packages\django\template\loader.py" in render_to_string
  68.     return template.render(context, request)

File "C:\Users\irene\virtualenv\spss_online_env\lib\site-packages\django\template\backends\django.py" in render
  66.             return self.template.render(context)

File "C:\Users\irene\virtualenv\spss_online_env\lib\site-packages\django\template\base.py" in render
  207.                     return self._render(context)

File "C:\Users\irene\virtualenv\spss_online_env\lib\site-packages\django\template\base.py" in _render
  199.         return self.nodelist.render(context)

File "C:\Users\irene\virtualenv\spss_online_env\lib\site-packages\django\template\base.py" in render
  990.                 bit = node.render_annotated(context)

File "C:\Users\irene\virtualenv\spss_online_env\lib\site-packages\django\template\base.py" in render_annotated
  957.             return self.render(context)

File "C:\Users\irene\virtualenv\spss_online_env\lib\site-packages\django\template\loader_tags.py" in render
  177.             return compiled_parent._render(context)

File "C:\Users\irene\virtualenv\spss_online_env\lib\site-packages\django\template\base.py" in _render
  199.         return self.nodelist.render(context)

File "C:\Users\irene\virtualenv\spss_online_env\lib\site-packages\django\template\base.py" in render
  990.                 bit = node.render_annotated(context)

File "C:\Users\irene\virtualenv\spss_online_env\lib\site-packages\django\template\base.py" in render_annotated
  957.             return self.render(context)

File "C:\Users\irene\virtualenv\spss_online_env\lib\site-packages\django\template\loader_tags.py" in render
  72.                 result = block.nodelist.render(context)

File "C:\Users\irene\virtualenv\spss_online_env\lib\site-packages\django\template\base.py" in render
  990.                 bit = node.render_annotated(context)

File "C:\Users\irene\virtualenv\spss_online_env\lib\site-packages\django\template\base.py" in render_annotated
  957.             return self.render(context)

File "C:\Users\irene\virtualenv\spss_online_env\lib\site-packages\django\template\defaulttags.py" in render
  458.             url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)

File "C:\Users\irene\virtualenv\spss_online_env\lib\site-packages\django\urls\base.py" in reverse
  91.     return force_text(iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs)))

File "C:\Users\irene\virtualenv\spss_online_env\lib\site-packages\django\urls\resolvers.py" in _reverse_with_prefix
  497.         raise NoReverseMatch(msg)

Exception Type: NoReverseMatch at /paypal-cancel/
Exception Value: Reverse for '' not found. '' is not a valid view function or pattern name.

5
您需要在这里使用应用程序名称,例如{% url 'core:home' %},其中core是应用程序的名称,home是视图名称。 - Dhiraj
这个回答解决了你的问题吗?什么是NoReverseMatch错误,我该如何修复它?(https://dev59.com/kFoT5IYBdhLWcg3wlwaR) - Abdul Aziz Barkat
26个回答

93

当您使用url标记时,应对字符串文字使用引号,例如:

{% url 'products' %}

目前product被视为变量,并在错误信息中评估为''


6
没问题。这就是全部内容。我在模板中添加了引号和在urls.py中添加了name='products',现在它可以工作了。 谢谢Alasdair! - Ire
这也可能是“为什么在升级django后,向同一页面提交的传统django表单不再起作用”的正确答案。我发表此评论是为了让Google帮助其他人找到答案。 - hlongmore

51
  1. 指定URL的语法是{% url namespace:url_name %},请检查您是否在urls.py中添加了app_name
  2. 在我的情况下,我拼错了url_name。urls.py文件中的内容为path('<int:question_id>/', views.detail, name='question_detail'),而index.html文件中有以下条目:<li><a href="{% url 'polls:detail' question.id %}">{{ question.question_text }}</a></li>。请注意名称不正确。

2
在我的情况下,我将app_name添加到了我的urls.py中,但是忘记包含“namespace:”前缀。因此感谢您提醒我! - Andrés Meza-Escallón
3
这是目前我找到的最佳答案之一。似乎没有人提到 "{% url 'namespace:url_name' %}" - 人们的回复是 "{%url 'url_name' %}"。 - Kaszanas
兄弟,谢谢你指出来 - 顺便说一下,我觉得 Django 官方教程可能有一个错误?他们也省略了命名空间前缀... - logicOnAbstractions
值得一提的是,在命名空间和 URL 名称之间没有空格。在我的情况下,空格就是错误的原因。 - Swati Srivastava

27

在未指定模式名称之前,我收到了相同的错误。

在我的情况下:

app-name:Blog

pattern-name:post-delete

reverse_lazy('Blog:post-delete') 可行。


你在哪里添加 reverse_lazy('Blog:post-delete') - AnonymousUser
例如,在分配success_url或在get_success_url方法中。 - Krishna

11

在模板中添加商店名称,格式如下:{% url 'app_name:url_name' %}

其中,app_name 为 "store"。

在 urls.py 中:

path('search', views.searched, name="searched"),

<form action="{% url 'store:searched' %}" method="POST">


9

您可以使用其中之一。

如果您没有(app_name),这是解决方案。

在 urls.py 中。

urlpatterns = [
    path('', dashboard.as_view(), name='dashboard'),
]

在template.html中

<a href="{% url 'dashboard' %}"></a>

如果您使用了(app_name),这是解决方案。
在urls.py中。
app_name = 'Blog'
urlpatterns = [
    path('', dashboard.as_view(), name='dashboard'),
]

在template.html中

<a href="{% url 'Blog:dashboard' %}"></a>

哇,我不知道我读了多少关于反转的文章,而你的这篇文章确实帮助我最终理解了它。谢谢!!! - Carlo

8
在应用程序的 urls.py 文件中指定 app_name,然后在模板中使用此 app_name 和url的字面视图名称字符串。请保留HTML标记。
syntax --> {% url 'app_name:urlname' %}

app_name = "demo".   # right above url patterns in app
url_patterns = [
('login/', views.login, name = 'login')
]

<a href="{% url 'demo:login' %}".  # Use this in templatep

注意:在urls.py文件中,在url_patterns上方使用app_name


6

在urls.py文件中修复urlpatterns

例如,我的应用程序名称是“simulator”,

loginlogout的URL模式看起来像:

urlpatterns = [
    ...
    ...
    url(r'^login/$', simulator.views.login_view, name="login"),
    url(r'^logout/$', simulator.views.logout_view, name="logout"),
    ...
    ...

]

4
在我的情况下,出现了模板中url标签的错误。在我的url标签中,我写了类似于

{% url 'polls:details' question.id %}

而在视图函数里,我却写成了:

def details(request, question_id): 这里写代码

所以,你可能首先要检查的是拼写是否正确。接下来可以尝试上面的建议。

4
在我的情况下,这个错误是因为我忘记在url_name中添加app_name。以下是我的应用程序urls.py
    app_name = "wikis"
    urlpatterns = [
        path("", views.index, name="index"),
        path("wiki/<str:name>", views.get_page, name="get_page"),
       ]

以下是我的函数返回语句,我忘记在反向URL中放置app_name
    return HttpResponseRedirect(reverse("get_page", kwargs={'name':title}))

正确的代码应该是

    return HttpResponseRedirect(reverse("wikis:get_page", kwargs={'name':title}))

这个答案非常接近我解决问题的方法。我在路径函数中使用了不同的名称,所以它没有匹配成功。但是,在Reverse函数中使用正确的路径名称而不是应用程序名称后,它就起作用了。因此,根据上面的解释,这对我有用。<code>return HttpResponseRedirect(reverse("get_page", kwargs={'name':title}))</code> - Suvodeep Dubey

2

始终确保在使用HttpResponseRedirect和reverse时,reverse内指定的名称与urls.py内路径所给定的名称相同。

这就是我遇到的问题,通过反复试验我找到了解决方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接