Django:NoReverseMatch不是有效的函数

时间:2019-06-27 21:06:56

标签: python django jinja2

在虚拟环境中运行本地Django开发服务器(2.2),我遇到了追溯。属于此错误的基本关键字包括“ django.urls.exceptions.NoReverseMatch”和“不是有效的视图函数或模式名称。”

我正在做尼克·沃尔特(Nick Walter)编写的类似Udemy的课程。课程材料的一部分涉及使用Django编写基本博客。我的尼克的博客模块即将结束。

我认为我在某处错误地引用了一个函数,或者可能是我的urlpattern配置错误。还有其他一些SO成员也遇到了类似的错误,其解决方案通常涉及纠正拼写错误。我尝试过删除post_details视图函数的多元性。我尝试使用不同的正则表达式组合(和不使用)对urls.py进行变体。我觉得我在这里忽略了一些琐碎的事情。

到了将我的代码与课程讲师的模块末尾源代码进行比较的地步,我一生都无法找出自己在做错什么。

这是我的代码:

urls.py

from django.urls import path, re_path
# from . import views
from posts.views import *
from redactors.views import *
from counters.views import *
from django.conf.urls.static import static
from django.conf import settings

urlpatterns = [
  path('admin/', admin.site.urls),
  path('', home, name='home'),
  path('result/', result, name='result'),
  path('seth/', counters, name='seth'),
  path('james/', posts, name='james'),
  re_path(r'^posts/(?P<post_id>[0-9]+)/$', post_details, name='james'),
  path('simon/', redactors, name='simon'),
] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) 

帖子/views.py

from django.shortcuts import redirect, render, get_object_or_404
from .models import Post

def posts(request):
    posts = Post.objects.order_by('-pub_date')
    return render(request, 'posts/james.html', {'posts':posts})

def post_details(request, post_id):
    post = get_object_or_404(Post,pk=post_id)
    return render(request, 'posts/detailed.html', {'post':post})

posts / templates / posts / detailed.html

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <title>Neptune Blog</title>

  </head>
  <body>

  <h1>{{ post.title }}</h1>

      <a href="{% url 'post_details' post.id %}"><h1>{{ post.title }}</h1></a>
      <h4><span class="glyphicon glyphicon-time" aria-hidden="true"></span> {{ post.pub_date_pretty }}</h4>
      <br />
      <img src="{{ post.image.url }}" class="img-responsive center-block" style="max-height:300px;" />
      <br />
      <p>{{ post.body }}</p>
      <br />
      <br />
</body>
</html>

我希望我的博客能够正确加载和呈现。

Here is a screenshot of the Django debugger showing the traceback in my web browser.

这是完整的shell追溯:

  

第660行,文件_reverse_with_prefix中的“ /home//dev/projects/python/2018-and-2019/CC_Redact_Iter2/venv/lib/python3.7/site-packages/django/urls/resolvers.py” / p>      

提高NoReverseMatch(msg)

     

django.urls.exceptions.NoReverseMatch:找不到'post_details'的反向字符。 “ post_details”不是有效的视图函数或模式名称。

1 个答案:

答案 0 :(得分:1)

如果我们看一下urls.py,我们会看到:

# urls.py

urlpatterns = [
    # ...
    re_path(r'^posts/(?P<post_id>[0-9]+)/$', post_details, name='james'),
    # ...
]

因此视图的名称james,而不是post_details。因此,有两种选择:

  1. 引用视图时使用james;或
  2. 将视图名称更改为post_details

使用james作为视图的名称

因此,您应将网址写为:

<a href="{% url 'james' post_id=post.id %}"><h1>{{ post.title }}</h1></a>

更改视图名称

或者您也可以更改视图的名称(将name='james'更改为name='post_details',因为这可能是更好的名称)。因此,在这种情况下,您需要将已经引用james的所有内容更改为新视图:

# urls.py

urlpatterns = [
    # ...
    re_path(r'^posts/(?P<post_id>[0-9]+)/$', post_details, name='post_details'),
    # ...
]

在此处更改视图名称甚至更重要,因为现在有两个视图以名称'james'命名,造成很多混乱。