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>