如何修复未找到的参数“{'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})
我在 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})