未找到带有参数“()”和关键字参数“'pk':6”的“post_edit”的反向。尝试了 0 种模式:[]
Posted
技术标签:
【中文标题】未找到带有参数“()”和关键字参数“\'pk\':6”的“post_edit”的反向。尝试了 0 种模式:[]【英文标题】:Reverse for 'post_edit' with arguments '()' and keyword arguments ''pk': 6' not found. 0 pattern(s) tried: []未找到带有参数“()”和关键字参数“'pk':6”的“post_edit”的反向。尝试了 0 种模式:[] 【发布时间】:2017-08-12 06:30:12 【问题描述】:我一直在关注djangogirls' tutorial 用 django 创建一个博客,几乎没有任何问题,但现在我继续使用他们的extensions tutorial,它适用于第一个创建的 Web 应用程序,我'当我试图了解给定帖子的详细信息时,我遇到了标题中的错误,这在以前可以正常工作。
这是详细的错误消息
环境:
请求方法:GET 请求地址:http://127.0.0.1:8000/post/6/
Django 版本:1.10.6 Python 版本:3.5.2 已安装的应用程序: ['django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', '博客'] 已安装的中间件: ['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']
模板错误:在模板中 /home/frank/Desarrollo/python/devdjango/djangogirlstut/blog/templates/blog/post_detail.html, 第 14 行的错误 使用参数 '()' 和 'post_new' 反向 未找到关键字参数“”。尝试了 0 个模式:[] 4 : 5 : % if post.published_date % 6 : 7 : post.published_date 8 : 9:% else % 10:发布 11: % endif % 12 : % if user.is_authenticated % 13 : 14 : 15 : % endif % 16 :
post.title
17 :post.text|linebreaksbr
18 : 19 : % 端块 % 20 :追溯:
文件 “/home/frank/Desarrollo/python/devdjango/djangogirlstut/lib/python3.5/site-packages/django/core/handlers/exception.py” 在内部 42. response = get_response(request)
文件 “/home/frank/Desarrollo/python/devdjango/djangogirlstut/lib/python3.5/site-packages/django/core/handlers/base.py” 在 _get_response 187. response = self.process_exception_by_middleware(e, request)
文件 “/home/frank/Desarrollo/python/devdjango/djangogirlstut/lib/python3.5/site-packages/django/core/handlers/base.py” 在 _get_response 185. response = Wrapped_callback(request, *callback_args, **callback_kwargs)
文件 “/home/frank/Desarrollo/python/devdjango/djangogirlstut/blog/views.py” 在 post_detail 中 15.return render(request, 'blog/post_detail.html', 'post': post)
文件 “/home/frank/Desarrollo/python/devdjango/djangogirlstut/lib/python3.5/site-packages/django/shortcuts.py” 在渲染中 30. content = loader.render_to_string(template_name, context, request, using=using)
文件 “/home/frank/Desarrollo/python/devdjango/djangogirlstut/lib/python3.5/site-packages/django/template/loader.py” 在 render_to_string 68. return template.render(context, request)
文件 “/home/frank/Desarrollo/python/devdjango/djangogirlstut/lib/python3.5/site-packages/django/template/backends/django.py” 在渲染中 66. return self.template.render(context)
文件 “/home/frank/Desarrollo/python/devdjango/djangogirlstut/lib/python3.5/site-packages/django/template/base.py” 在渲染中 208. return self._render(context)
文件 “/home/frank/Desarrollo/python/devdjango/djangogirlstut/lib/python3.5/site-packages/django/template/base.py” 在_render 199. return self.nodelist.render(context)
文件 “/home/frank/Desarrollo/python/devdjango/djangogirlstut/lib/python3.5/site-packages/django/template/base.py” 在渲染中 994. bit = node.render_annotated(context)
文件 “/home/frank/Desarrollo/python/devdjango/djangogirlstut/lib/python3.5/site-packages/django/template/base.py” 在 render_annotated 961. return self.render(context)
文件 “/home/frank/Desarrollo/python/devdjango/djangogirlstut/lib/python3.5/site-packages/django/template/loader_tags.py” 在渲染中 174. 返回已编译的_parent._render(context)
文件 “/home/frank/Desarrollo/python/devdjango/djangogirlstut/lib/python3.5/site-packages/django/template/base.py” 在_render 199. return self.nodelist.render(context)
文件 “/home/frank/Desarrollo/python/devdjango/djangogirlstut/lib/python3.5/site-packages/django/template/base.py” 在渲染中 994. bit = node.render_annotated(context)
文件 “/home/frank/Desarrollo/python/devdjango/djangogirlstut/lib/python3.5/site-packages/django/template/base.py” 在 render_annotated 961. return self.render(context)
文件 “/home/frank/Desarrollo/python/devdjango/djangogirlstut/lib/python3.5/site-packages/django/template/defaulttags.py” 在渲染中 315. 返回nodelist.render(context)
文件 “/home/frank/Desarrollo/python/devdjango/djangogirlstut/lib/python3.5/site-packages/django/template/base.py” 在渲染中 994. bit = node.render_annotated(context)
文件 “/home/frank/Desarrollo/python/devdjango/djangogirlstut/lib/python3.5/site-packages/django/template/base.py” 在 render_annotated 961. return self.render(context)
文件 “/home/frank/Desarrollo/python/devdjango/djangogirlstut/lib/python3.5/site-packages/django/template/defaulttags.py” 在渲染中 439. url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
文件 “/home/frank/Desarrollo/python/devdjango/djangogirlstut/lib/python3.5/site-packages/django/urls/base.py” 相反 91. return force_text(iri_to_uri(resolver._reverse_with_prefix(视图,前缀, *args, **kwargs)))
文件 “/home/frank/Desarrollo/python/devdjango/djangogirlstut/lib/python3.5/site-packages/django/urls/resolvers.py” 在 _reverse_with_prefix 392. (lookup_view_s, args, kwargs, len(patterns), patterns)
异常类型:NoReverseMatch at /post/6/ 异常值:Reverse 对于带有参数 '()' 和关键字参数 '' 的 'post_new' 不是 成立。尝试了 0 个模式:[]
网站 urls.py 文件
from django.conf.urls import include, url
from django.contrib import admin
from django.contrib.auth import views
urlpatterns = [
url(r'^admin/', include(admin.site.urls)),
url(r'^accounts/login/$', views.login, name='login'),
url(r'^accounts/logout/$', views.logout, name='logout', kwargs='next_page': '/'),
url(r'', include('blog.urls', namespace='blog')),
]
blog/urls.py 文件(blog 是应用名称)
from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^$', views.post_list, name='post_list'),
url(r'^post/(?P<pk>\d+)/$', views.post_detail, name='post_detail'),
url(r'^post/new/$', views.post_new, name='post_new'),
url(r'^drafts/$', views.post_draft_list, name='post_draft_list'),
url(r'^post/(?P<pk>\d+)/publish/$', views.post_publish, name='post_publish'),
url(r'^post/(?P<pk>\d+)/remove/$', views.post_remove, name='post_remove'),
]
有问题的模板 blog/templates/blog/post_detail.html
% extends 'blog/base.html' %
% block content %
<div class="post">
% if post.published_date %
<div class="date">
post.published_date
</div>
% else %
<a class="btn btn-default" href="% url 'blog:post_publish' pk=post.pk %">Publish</a>
% endif %
% if user.is_authenticated %
<a class="btn btn-default" href="% url 'blog:post_edit' pk=post.pk %"><span class="glyphicon glyphicon-pencil"></span></a>
<a class="btn btn-default" href="% url 'blog:post_remove' pk=post.pk %"><span class="glyphicon glyphicon-remove"></span></a>
% endif %
<h1> post.title </h1>
<p> post.text|linebreaksbr </p>
</div>
% endblock %
及其扩展的基本模板
% load staticfiles %
<html>
<head>
<title>Django Girls blog</title>
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">
<link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">
<link href='//fonts.googleapis.com/css?family=Lobster&subset=latin,latin-ext' rel='stylesheet' type='text/css'>
<link rel="stylesheet" href="% static 'css/blog.css' %">
</head>
<body>
<div class="page-header">
% if user.is_authenticated %
<a href="% url 'blog:post_new' %" class="top-menu"><span class="glyphicon glyphicon-plus"></span></a>
<a href="% url 'blog:post_draft_list' %" class="top-menu"><span class="glyphicon glyphicon-edit"></span></a>
<p class="top-menu">Hello user.username <small>(<a href="% url 'logout' %">Log out</a>)</small></p>
% else %
<a href="% url 'login' %" class="top-menu"><span class="glyphicon glyphicon-lock"></span></a>
% endif %
<h1><a href="/">Django Girls Blog</a></h1>
</div>
<div class="content container">
<div class="row">
<div class="col-md-8">
% block content %
% endblock %
</div>
</div>
</div>
</body>
</html>
我尝试过命名空间,我没有更改 urls 文件中的正则表达式(即它们与之前的工作相同),django 版本还可以(1.10)...我读过@987654324 @ 但没有雪茄。
关于我可能在哪里出错的任何想法?
测试 int bash:
from django.urls import reverse
reverse('blog:post_new') Traceback (most recent call last): File "<stdin>", line 1, in <module> File
"/home/frank/Desarrollo/python/devdjango/djangogirlstut/lib/python3.5/site-packages/django/urls/base.py",
line 33, in reverse
resolver = get_resolver(urlconf) File "/home/frank/Desarrollo/python/devdjango/djangogirlstut/lib/python3.5/site-packages/django/urls/resolvers.py",
line 67, in get_resolver
urlconf = settings.ROOT_URLCONF File "/home/frank/Desarrollo/python/devdjango/djangogirlstut/lib/python3.5/site-packages/django/conf/__init__.py",
line 53, in __getattr__
self._setup(name) File "/home/frank/Desarrollo/python/devdjango/djangogirlstut/lib/python3.5/site-packages/django/conf/__init__.py",
line 39, in _setup
% (desc, ENVIRONMENT_VARIABLE)) django.core.exceptions.ImproperlyConfigured: Requested setting
ROOT_URLCONF, but settings are not configured. You must either define
the environment variable DJANGO_SETTINGS_MODULE or call
settings.configure() before accessing settings.
【问题讨论】:
【参考方案1】:blog
应用位于命名空间 blog
下。对此应用的 URL 的每个引用都应采用 namespace:url_name
的形式。
因此,您应该在% url %
模板标签内使用命名空间。您在违规模板中正确执行此操作,您也应该在基本模板中执行相同操作。
所以在base.html
内部(以及其他任何地方都涉及blog
url):
<!-- base.html -->
% url 'blog:post_new' %
% url 'blog:post_draft_list' %
保持 % url 'login' %
和 % url 'logout' %
不变。它们没有命名空间。
【讨论】:
我刚试过,但没有任何变化。还是一样的错误信息:S 你发过post_detail.html
吗?
是的,它是“违规模板”。我最好说清楚
回溯在第 14 行的post_detail.html
内部说。但是因为post_detail.html
扩展了base.html
,所以它是base.html
的第14 行,它确实调用了反转post_new
。命名空间(在base.html
内)没有清除错误?
不,它没有。抱歉,我没有更新模板,现在它反映了它。以上是关于未找到带有参数“()”和关键字参数“'pk':6”的“post_edit”的反向。尝试了 0 种模式:[]的主要内容,如果未能解决你的问题,请参考以下文章
未找到带有参数 '('',)' 的 'delete_post' 的反向操作。尝试了 1 种模式:['article/(?P<pk>[0-9]+)/remove$']