Reverse for 'post_publish' with keyword arguments '{'pk': ''}'' not found in Django
В настоящее время я заканчиваю курс по разработке полного стека с использованием python и django, и меня попросили клонировать блог. Каждый раз, когда я пытаюсь сохранить новый пост, опубликовать новый пост или просмотреть детали поста, я получаю ошибку:
NoReverseMatch at /post/7 Реверс для 'post_publish' с ключевыми аргументами '{'pk': ''}'' не найден. Проверен 1 шаблон(ы): ['post/(?Pd+)/publish/$']
Я проверил stack overflow, документацию django и множество блогов, но не смог решить эту проблему
mysite urls.py
from django.contrib import admin
from django.urls import path, re_path, include
from django.contrib.auth import views
from blog.urls import urlpatterns as blogpatterns
urlpatterns = [
path("admin/", admin.site.urls),
path('', include('blog.urls', namespace='blog')),
path('accounts/login/', views.LoginView.as_view(), name='login'),
path('accounts/logout/', views.LogoutView.as_view(), name='logout', kwargs={'next_page': '/'})
]
blog urls.py
from django.urls import path, re_path
from . import views
app_name = 'blog'
urlpatterns = [
path('about/',views.AboutView.as_view(),name='about'),
path('',views.PostListView.as_view(),name='post_list'),
re_path(r'^post/(?P<pk>\d+)$',views.PostDetailView.as_view(),name='post_detail'),
re_path(r'^post/new/$',views.CreatePostView.as_view(),name='post_new'),
re_path(r'^post/(?P<pk>\d+)/edit/$',views.PostUpdateView.as_view(),name='post_edit'),
re_path(r'^post/(?P<pk>\d+)/remove/$',views.PostDeleteView.as_view(),name='post_remove'),
re_path(r'^drafts/$',views.DraftListView.as_view(),name='post_draft_list'),
re_path(r'^post/(?P<pk>\d+)/publish/$',views.post_publish,name='post_publish'),
re_path(r'^post/(?P<pk>\d+)/comment/$', views.add_comment_to_post, name='add_comment_to_post'),
re_path(r'^comment/(?P<pk>\d+)/approve/$', views.comment_approve, name='comment_approve'),
re_path(r'^comment/(?P<pk>\d+)/remove/$', views.comment_remove, name='comment_remove'),
]
views.py
from django.shortcuts import render
# Create your views here.
from django.utils import timezone
from django.shortcuts import render, get_object_or_404, redirect
from blog.models import Post, Comment
from blog.forms import PostForm, CommentForm
from django.urls import reverse_lazy, reverse
from django.contrib.auth.mixins import LoginRequiredMixin
from django.contrib.auth.decorators import login_required
from django.views.generic import (TemplateView, ListView,
DetailView, CreateView,
UpdateView, DeleteView)
from django.http import HttpResponseRedirect
# Create your views here.
class AboutView(TemplateView):
template_name = 'about.html'
class PostListView(ListView):
model = Post
def get_queryset(self):
return Post.objects.filter(published_date__lte=timezone.now()).order_by('-published_date')
class PostDetailView(DetailView):
model = Post
context_object_name = 'post_detail'
template_name = 'post_detail.html'
class CreatePostView(LoginRequiredMixin,CreateView):
login_url = '/login/'
redirect_field_name = 'post_detail'
form_class = PostForm
model = Post
class PostUpdateView(LoginRequiredMixin,UpdateView):
login_url = '/login/'
redirect_field_name = 'blog/post_detail.html'
form_class = PostForm
model = Post
class DraftListView(LoginRequiredMixin,ListView):
login_url = '/login/'
redirect_field_name = 'blog/post_list.html'
model = Post
def get_queryset(self):
return Post.objects.filter(published_date__isnull=True).order_by('created_date')
class PostDeleteView(LoginRequiredMixin,DeleteView):
model = Post
success_url = reverse_lazy('post_list')
#######################################
## Functions that require a pk match ##
#######################################
@login_required
def post_publish(request,pk):
post = get_object_or_404(Post,pk=pk)
post.publish()
return redirect('blog:post_detail',pk=post.pk)
@login_required
def add_comment_to_post(request,pk):
post=get_object_or_404(Post,pk=pk)
if request.method =='POST':
form=CommentForm(request.POST)
if form.is_valid():
comment=form.save(commit=False)
comment.post=post
comment.save()
return redirect('post_detail',pk=post.pk)
else:
form=CommentForm()
return render(request,'blog/comment_form.html',{'form':form})
@login_required
def comment_approve(request, pk):
comment = get_object_or_404(Comment, pk=pk)
comment.approve()
return redirect('post_detail',pk=comment.post.pk)
@login_required
def comment_remove(request, pk):
comment = get_object_or_404(Comment, pk=pk)
post_pk = comment.post.pk
comment.delete()
return redirect('post_detail', pk=post_pk)
base.html
post_list.html
{% extends "blog/base.html" %}
{% block content %}
<div class="centerstage">
{% for post in post_list %}
<h1><a href="{% url 'blog:post_detail' pk=post.pk %}">{{post.title}}</a></h1>
<div class="date">
<p>published on: {{post.published|date:"D-M-Y"}}</p>
</div>
<a href="{% url 'blog:post_detail' pk=post.pk %}">Comments: {{post.approve_comment.count}}</a>
{% endfor %}
</div>
{% endblock %}
post_detail.html
{% extends "blog/base.html" %}
{% block content %}
<h1 class="posttitle loader">{{post.title}}</h1>
{% if post.published_date %}
<div class="date postdate">
{{post.published_date}}
</div>
{% else %}
<a class="btn btn-default" href="{% url 'blog:post_publish' pk=post.pk %}">Publish</a>
{% endif %}
<p class="postcontent">{{post.text|safe|linebreaksbr}}</p>
<!-- safe replaces bold, because when working with javascript medium, bold will come out with the tags -->
{% if user.is_athenticated %}
<a class="btn btn-primary" href="{% url 'post_edit' pk=post.pk %}">
<span class="glyphicon glyphicon-pencil"></span>
</a>
<a class="btn btn-primary" href="{% url 'post_remove' pk=post.pk %}">
<span class="glyphicon glyphicon-remove"></span>
</a>
{% endif %}
<hr>
<!-- horizontal break -->
<a class="btn btn-primary btn-comment" href="{% url 'blog:add_comment_to_post' pk=post.pk %}">add comment</a>
<div class="container">
{% for comments in post.comments.all %}
<br>
{% if user.is_authenticated or comment.approved_comment %}
{{comment.created_date}}
{% if not comment.approved_comment %}
<a class="btn btn-default" href="{% url 'comment_remove' pk=comment.pk %}">
<span class="glyphicon glyphicon-remove"></span>
</a>
<a class="btn btn-primary" href="{% url 'comment_approve' pk=comment.pk %}">
<span class="glyphicon glyphicon-ok"></span>
</a>
{% endif %}
<p>{{comment.text|safe|linebreaks}}</p>
<p>Posted By: {{comment.author}}</p>
{% endif %}
{% empty %}
<p>No comments posted</p>
{% endfor %}
</div>
{% endblock %}
Ниже приведено сообщение об ошибке
NoReverseMatch at /post/1
Reverse for 'post_publish' with keyword arguments '{'pk': ''}' not found. 1 pattern(s) tried: ['post/(?P<pk>\\d+)/publish/$']
Request Method: GET
Request URL: http://127.0.0.1:8000/post/1
Django Version: 4.1.3
Exception Type: NoReverseMatch
Exception Value:
Reverse for 'post_publish' with keyword arguments '{'pk': ''}' not found. 1 pattern(s) tried: ['post/(?P<pk>\\d+)/publish/$']
Exception Location: C:\Users\Madlibs\AppData\Local\Programs\Python\Python310\lib\site-packages\django\urls\resolvers.py, line 828, in _reverse_with_prefix
Raised during: blog.views.PostDetailView
Python Executable: C:\Users\Madlibs\AppData\Local\Programs\Python\Python310\python.exe
Python Version: 3.10.4
Python Path:
['C:\\Users\\Madlibs\\Desktop\\madlibs\\blog_project\\mysite',
'C:\\Users\\Madlibs\\AppData\\Local\\Programs\\Python\\Python310\\python310.zip',
'C:\\Users\\Madlibs\\AppData\\Local\\Programs\\Python\\Python310\\DLLs',
'C:\\Users\\Madlibs\\AppData\\Local\\Programs\\Python\\Python310\\lib',
'C:\\Users\\Madlibs\\AppData\\Local\\Programs\\Python\\Python310',
'C:\\Users\\Madlibs\\AppData\\Roaming\\Python\\Python310\\site-packages',
'C:\\Users\\Madlibs\\AppData\\Local\\Programs\\Python\\Python310\\lib\\site-packages']
Server time: Tue, 15 Nov 2022 07:50:02 +0000
Ошибка во время рендеринга шаблона В шаблоне C:\Users\Madlibs\Desktop\madlibs\blog_project\mysite\blog\templates\blog\post_detail.html, ошибка в строке 11
Поиск для 'post_publish' с ключевыми аргументами '{'pk': ''}'' не найден. Проверен 1 шаблон(ы): ['post/(?P\d+)/publish/$']
1 {% extends "blog/base.html" %}
2
3 {% block content %}
4 <h1 class="posttitle loader">{{post.title}}</h1>
5
6 {% if post.published_date %}
7 <div class="date postdate">
8 {{post.published_date}}
9 </div>
10 {% else %}
11 <a class="btn btn-default" href="{% url 'blog:post_publish' pk=post.pk %}">Publish</a>
12 {% endif %}
13
14 <p class="postcontent">{{post.text|safe|linebreaksbr}}</p>
15 <!-- safe replaces bold, because when working with javascript medium, bold will come out with the tags -->
16
17 {% if user.is_athenticated %}
18 <a class="btn btn-primary" href="{% url 'post_edit' pk=post.pk %}">
19 <span class="glyphicon glyphicon-pencil"></span>
20 </a>