【问题标题】:how to fix arguments '{'pk'}' not found. 1 pattern(s) tried: ['post/(?P<slug>[^/]+)/$'] in PostDetailView如何修复未找到的参数“{'pk'}”。尝试了 1 种模式:PostDetailView 中的 ['post/(?P<slug>[^/]+)/$']
【发布时间】:2019-10-12 02:42:37
【问题描述】:

我在帖子网址中使用 slug,但在发送帖子更新时出现错误

views.py 中有这个错误return super().form_valid(form)

未找到带有关键字参数“{'pk': 2}”的“postdetail”的反向操作。尝试了 1 种模式:['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'),

......
]

【问题讨论】:

  • 添加有问题的PostDetailView
  • 我很确定post/&lt;slug&gt;/ 是错误的。我想你想要post/(?P&lt;slug&gt;)/
  • 它不起作用
  • 那么你可能做错了什么。
  • @RedCricket post/&lt;slug&gt;/ 也是正确的。这是 Django 的新 url 模式语法。

标签: django django-views django-urls


【解决方案1】:

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

改变这个:

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

到这里:

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

【讨论】:

    猜你喜欢
    • 2020-11-24
    • 2020-05-13
    • 2019-09-07
    • 2020-05-18
    • 2019-11-01
    • 1970-01-01
    • 2021-08-10
    • 2020-07-20
    • 1970-01-01
    相关资源
    最近更新 更多