Django не может найти мой DetailView с первичным ключом

Я пытаюсь сделать простую страницу на Django, где посты отображаются с использованием первичных ключей. Однако страница DetailView с моими постами не может быть отображена.

Это моя модель:

class Post(models.Model):
author = models.CharField(max_length=100)
title = models.CharField(max_length=100)
posted_date = timezone.now()
text = models.TextField()

def get_absolute_url(self):
    return reverse("postdetail", kwargs={"pk": self.pk})

def __str__(self):
    return self.title

и вот мой список шаблонов url:

urlpatterns = [
url(r'^posts/(?P<pk>\d+)$', views.PostDetail.as_view(), name="postdetail"), 
url(r'^$', views.index, name="index"), 
url(r'^thanks/$', views.Thanks.as_view(), name="thanks"), 
url(r'^postlist/$', views.PostList.as_view(), name="postlist"), 
]

Шаблон находится в моей папке templates под именем "post_detail.html".

Вот DetailView:

class PostDetail(DetailView):
context_object_name = 'post_details'
model = Post

Я не могу понять, где у меня может быть ошибка. У меня есть ListView, который показывает мои посты, включая первичные ключи. Но когда я пытаюсь открыть URL http://127.0.0.1:8000/posts/1/. я получаю:

`Page not found (404)
Request Method: GET
Request URL:    http://127.0.0.1:8000/posts/1/
Using the URLconf defined in myproj.urls, Django tried these URL patterns, in this order:

admin/
^posts/(?P<pk>\d+)$ [name='postdetail']
^$ [name='index']
^thanks/$ [name='thanks']
^postlist/$ [name='postlist']
The current path, posts/1/, didn’t match any of these.

Есть ли у вас предположение, почему URL не может быть найден? Большое спасибо.`

Вместо url() используйте path()

from django.urls import path

urlpatterns = [
    path('', views.index, name = "index"),
    path('posts/<int:pk>', views.PostDetail.as_view(), name = "postdetail"),
    path('postlist/', views.PostList.as_view(), name="postlist"),
    path('thanks', views.Thanks.as_view(), name = "thanks"),
]

NB: url() был устаревшим с версии 3.1 и удален в 4.0

Вы пытаетесь получить доступ к : http://127.0.0.1:8000/posts/1/ при определении следующего http://127.0.0.1:8000/posts/1 без зазора.

Попробуйте: http://127.0.0.1:8000/posts/1

Первым делом - это ваши представления. Вы можете отправить данные вашей базы данных с возвратом их в HTML.

views.py

def post(request,id):
    post = Post.objects.get(id=id)
    return render(request,'blog/index.html',{'post':post})

и перед отправкой данных в HTML вы должны получить id поста в вашем urls.py

urls.py

    path('post/<int:id>', views.post, name='post.blog')

Затем в вашем HTML вы можете обработать, что данные поступают из вашего views.py

index.html

<div class="post-content content">{{ post.body|safe }}</div>
Вернуться на верх