Я пытаюсь выучить Джанго, и я столкнулся с проблемой.

Reverse for 'post_detail' with arguments '()' and keyword arguments '{'pk': ''}' not found. 1 pattern(s) tried: ['post/(?P<pk>[0-9]+)/$']

Я искал ту же самую проблему, но решения не работали для меня. Может быть, это важно - я следую этому уроку http://tutorial.djangogirls.org/en/extend_your_application/index.html Спасибо!

Views.py

from django.shortcuts import render
from django.utils import timezone
from .models import Post
from django.shortcuts import render, get_object_or_404

def post_list(request):
    posts = Post.objects.filter(published_date__lte=timezone.now()).order_by('published_date')
    return render(request, 'blog/post_list.html', {'posts': posts})

def post_detail(request, pk):
        post = get_object_or_404(Post, pk=pk)
        return render(request, 'blog/post_detail.html', {'post': post})

Base.html

{% 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">
                       <h1><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h1>
                </div>
                <div class="content container">
                    <div class="row">
                        <div class="col-md-8">
                            {% block content %}
                            {% endblock %}
                        </div>
                    </div>
                </div>

        </body>
    </html>

Urls.py

from django.conf.urls import include, url
from . import views

urlpatterns = [
    url(r'^$', views.post_list, name='post_list'),
    url(r'^post/(?P<pk>[0-9]+)/$', views.post_detail, name='post_detail'),
]

Ошибка трассировки:

Environment:


Request Method: GET
Request URL: http://127.0.0.1:8000/

Django Version: 1.8.1
Python Version: 3.4.0
Installed Applications:
('django.contrib.admin',
 'django.contrib.auth',
 'django.contrib.contenttypes',
 'django.contrib.sessions',
 'django.contrib.messages',
 'django.contrib.staticfiles',
 'blog')
Installed Middleware:
('django.contrib.sessions.middleware.SessionMiddleware',
 'django.middleware.common.CommonMiddleware',
 'django.middleware.csrf.CsrfViewMiddleware',
 'django.contrib.auth.middleware.AuthenticationMiddleware',
 'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
 'django.contrib.messages.middleware.MessageMiddleware',
 'django.middleware.clickjacking.XFrameOptionsMiddleware',
 'django.middleware.security.SecurityMiddleware')


Template error:
In template D:\Projects\mysite\blog\templates\blog\base.html, error at line 13
   Reverse for 'post_detail' with arguments '()' and keyword arguments '{'pk': ''}' not found. 1 pattern(s) tried: ['post/(?P<pk>[0-9]+)/$']

   3 :         <head>



   4 :             <title>Django Girls blog</title>



   5 :             <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">



   6 :             <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">



   7 :             <link href='//fonts.googleapis.com/css?family=Lobster&subset=latin,latin-ext' rel='stylesheet' type='text/css'>



   8 :             <link rel="stylesheet" href="{% static 'css/blog.css' %}">



   9 :         </head>



   10 :         <body>



   11 : 



   12 :                 <div class="page-header">



   13 :                        <h1><a href=" {% url 'post_detail' pk=post.pk %} ">{{ post.title }}</a></h1>



   14 :                 </div>



   15 :                 <div class="content container">



   16 :                     <div class="row">



   17 :                         <div class="col-md-8">



   18 :                             {% block content %}



   19 :                             {% endblock %}



   20 :                         </div>



   21 :                     </div>



   22 :                 </div>



   23 : 


Traceback:
File "C:\Python34\lib\site-packages\django\core\handlers\base.py" in get_response
  132.                     response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "D:\Projects\mysite\blog\views.py" in post_list
  8.     return render(request, 'blog/post_list.html', {'posts': posts})
File "C:\Python34\lib\site-packages\django\shortcuts.py" in render
  67.             template_name, context, request=request, using=using)
File "C:\Python34\lib\site-packages\django\template\loader.py" in render_to_string
  99.         return template.render(context, request)
File "C:\Python34\lib\site-packages\django\template\backends\django.py" in render
  74.         return self.template.render(context)
File "C:\Python34\lib\site-packages\django\template\base.py" in render
  209.                     return self._render(context)
File "C:\Python34\lib\site-packages\django\template\base.py" in _render
  201.         return self.nodelist.render(context)
File "C:\Python34\lib\site-packages\django\template\base.py" in render
  903.                 bit = self.render_node(node, context)
File "C:\Python34\lib\site-packages\django\template\debug.py" in render_node
  79.             return node.render(context)
File "C:\Python34\lib\site-packages\django\template\loader_tags.py" in render
  135.         return compiled_parent._render(context)
File "C:\Python34\lib\site-packages\django\template\base.py" in _render
  201.         return self.nodelist.render(context)
File "C:\Python34\lib\site-packages\django\template\base.py" in render
  903.                 bit = self.render_node(node, context)
File "C:\Python34\lib\site-packages\django\template\debug.py" in render_node
  79.             return node.render(context)
File "C:\Python34\lib\site-packages\django\template\defaulttags.py" in render
  507.                         six.reraise(*exc_info)
File "C:\Python34\lib\site-packages\django\utils\six.py" in reraise
  659.         raise value
File "C:\Python34\lib\site-packages\django\template\defaulttags.py" in render
  493.             url = reverse(view_name, args=args, kwargs=kwargs, current_app=current_app)
File "C:\Python34\lib\site-packages\django\core\urlresolvers.py" in reverse
  579.     return force_text(iri_to_uri(resolver._reverse_with_prefix(view, prefix, *args, **kwargs)))
File "C:\Python34\lib\site-packages\django\core\urlresolvers.py" in _reverse_with_prefix
  496.                              (lookup_view_s, args, kwargs, len(patterns), patterns))

Exception Type: NoReverseMatch at /
Exception Value: Reverse for 'post_detail' with arguments '()' and keyword arguments '{'pk': ''}' not found. 1 pattern(s) tried: ['post/(?P<pk>[0-9]+)/$']
-1
J.Galt 14 Дек 2015 в 19:37

4 ответа

Лучший ответ

Я думаю, что ваша проблема в том, что вы пытаетесь получить доступ к одному post без итерации posts.

Как вы можете видеть в своем post_list виде, у вас есть:

...
return render(request, 'blog/post_list.html', {'posts': posts})

Итак, вы отправляете переменную с именем posts в свой шаблон.

Но в вашем шаблоне вы пытаетесь получить доступ к post:

<h1><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h1>

Но этого не существует.

Вы должны перебрать posts, пример:

{% for post in posts %}
    <h1><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h1>
{% endfor %}

Это должно сработать.

1
Gocht 14 Дек 2015 в 17:14

Проблема связана с:

{% url 'post_detail' pk=post.pk %}

В этой области в вашем base.html шаблоне нет переменной post, поэтому post.pk преобразуется в пустую строку. Итак, Django пытается сделать реверс URL с пустым pk, что не удается.

Чтобы {% url %} работал, вам нужно добавить туда сообщение.

1
miki725 14 Дек 2015 в 16:40

Я была такая же проблема. Просто замените это:

return redirect('blog.views.post_detail', pk=post.pk)
0
Tarcísio Allyson 31 Май 2017 в 01:05

Похоже, что вы пропустили часть в руководстве, здесь: http://tutorial.djangogirls.org/en/extend_your_application/index.html#create-a-template-link-to-a-posts-detail

На этом шаге он инструктирует вас создать новый шаблон, и строка, создающая вашу проблему, <h1><a href="{% url 'post_detail' pk=post.pk %}">{{ post.title }}</a></h1>, будет добавлена в этот шаблон.

Эта строка, в частности, не будет работать в вашем base.html, так как нет переменной с именем post. Эта переменная создается как часть цикла в новом шаблоне на этом этапе урока.

1
Joey Wilhelm 14 Дек 2015 в 16:42