如何修复未找到的参数“{'pk'}”。尝试了 1 种模式:PostDetailView 中的 ['post/(?P<slug>[^/]+)/$']

how to fix arguments '{'pk'}' not found. 1 pattern(s) tried: ['post/(?P<slug>[^/]+)/$'] in PostDetailView

我在 post url 中使用了 slug,但是在发送 post 更新时我得到了一个错误

我在 views.py return super().form_valid(form)

中有这个错误

Reverse for 'postdetail' with keyword arguments '{'pk': 2}' not found. 1 pattern(s) tried: ['post/(?P[^/]+)/$']

models.py


class Post(models.Model):
    title = models.CharField(max_length=60)
    slug = models.SlugField(max_length=60, unique=True)
    first_image = models.ImageField(null=True, upload_to='post_image')
    content = RichTextField()
    date_posted = models.DateTimeField(default=timezone.now)
    author = models.ForeignKey(User, on_delete=models.CASCADE)

    def save(self, *args, **kwargs):
        super().save(*args,**kwargs)

    def __str__(self):
        return self.title

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

def post_slug(sender, instance, *args, **kwargs):
    if not instance.slug:
        instance.slug =  unique_slug_generator(instance)


pre_save.connect(post_slug, sender=Post)



views.py

.........

class PostUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView):
    model = Post
    fields = ['title', 'first_image', 'content']

    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

    def test_func(self):
        post = self.get_object()
        if self.request.user == post.author:
            return True
        return False

urls.py

from django.urls import path, include
from django.contrib.auth import views as auth_views
from .views import (
    PostListView,
    PostDetailView,
    PostCreateView,
    PostUpdateView,
    PostDeleteView,
    UserPostListView
)
from . import views

urlpatterns = [
......

    path('post/<slug>/update/', PostUpdateView.as_view(), name='postupdate'),
    path('post/<slug>/', PostDetailView.as_view(), name='postdetail'),

......
]

postdetail url 只接受名为 slug 的参数。当你经过它时 pk。显然会失败。

改变这个:

return reverse('postdetail', kwargs={'pk': self.pk})

对此:

return reverse('postdetail', kwargs={'slug': self.slug})