在虚拟环境中运行本地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”不是有效的视图函数或模式名称。
答案 0 :(得分:1)
如果我们看一下urls.py
,我们会看到:
# urls.py
urlpatterns = [
# ...
re_path(r'^posts/(?P<post_id>[0-9]+)/$', post_details, name='james'),
# ...
]
因此视图的名称是james
,而不是post_details
。因此,有两种选择:
james
;或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'
命名,造成很多混乱。