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>

Вернуться на верх