Django - Ни один пользователь не соответствует заданному запросу. Страница не найдена 404: Представление списка постов пользователя нарушает представление деталей поста
Я довольно новичок в django и пытаюсь создать приложение для доски объявлений. Все шло гладко, пока я не попытался добавить функциональность для отображения списка сообщений по автору. У меня все получилось, но затем мой вид детализации сообщений начал выдавать ошибку "Ни один пользователь не соответствует заданному запросу. Страница не найдена 404", и я не могу понять, почему. Кто-нибудь может помочь?
views.py
class UserPostList(generic.ListView):
model = Post
# queryset = Post.objects.filter(status=1).order_by('-created_on')
template_name = 'user_posts.html'
paginate_by = 6
def get_queryset(self):
"""
Method to return posts restricted to 'published' status AND to
authorship by the user whose username is the parameter in the
url.
"""
user = get_object_or_404(User, username=self.kwargs.get('username'))
return Post.objects.filter(
status=1, author=user
).order_by('-created_on')
class FullPost(View):
def get(self, request, slug, *args, **kwargs):
"""
Method to get post object.
"""
queryset = Post.objects.filter(status=1)
post = get_object_or_404(queryset, slug=slug)
comments = post.comments.order_by('created_on')
liked = False
if post.likes.filter(id=self.request.user.id).exists():
liked = True
return render(
request,
"full_post.html",
{
"post": post,
"comments": comments,
"liked": liked
},
)
# I'll be adding a comment form in here too
urls.py
urlpatterns = [
...
path('<slug:slug>/', views.FullPost.as_view(), name='boards_post'),
...
path('<str:username>/', views.UserPostList.as_view(), name='user_posts'),
...
]
Сообщение об ошибке (При попытке просмотреть один пост (ранее работавший) после добавления представления UserPostList и маршрута)
Using the URLconf defined in mhcmsgboard.urls, Django tried these URL patterns, in this order:
1. admin/
2. summernote/
3. register/ [name='register']
4. profile/ [name='profile']
5. login/ [name='login']
6. logout/ [name='logout']
7. new/ [name='create_post']
8. <slug:slug>/update/ [name='update_post']
9. <slug:slug>/delete/ [name='delete_post']
10. <str:username>/ [name='user_posts']
The current path, test-post/, matched the last one.
Проблема заключается в том, что вы сопоставляете update_post
, delete_post
и user_posts
URL'ы с корнем. Как объясняет сообщение об ошибке, текущий запрос выполняется к user_posts
. И похоже, что у вас нет пользователя с именем test-post
.
Вы могли бы решить эту проблему, например, с помощью следующего URL conf:
urlpatterns = [
...
path('board/<slug:slug>/', views.FullPost.as_view(), name='boards_post'),
...
path('posts/<str:username>/', views.UserPostList.as_view(), name='user_posts'),
...
]
Таким образом, каждый путь будет уникальным, и Django будет знать, какой View ему нужно вызвать.
for <str:name> в пути "-" не разрешается использовать в имени, когда вы используете Slug, оба пути равны.
urlpatterns = [
...
path('<slug:slug>/', views.FullPost.as_view(), name='boards_post'),
...
path('<slug:username>/', views.UserPostList.as_view(), name='user_posts'),
]
есть 2 простых способа
- используйте подпуть для одного или обоих путей: user_post/<slug:username>/
- Используйте re_path и определите regex для изменения пути
exp: re_path(r'^(?P<username>\w+)/$', views.UserPostList.as_view()),