【问题标题】:MultipleObjectsReturned: get() returned more than one Post -- it returned 2MultipleObjectsReturned:get() 返回了多个 Post -- 它返回了 2
【发布时间】:2021-06-24 16:48:03
【问题描述】:

仅当多个用户的帖子标题相同时才会发生此错误。

例如,如果 john 有一个标题为“mypage”的页面,如果其他用户的页面标题与 john 相同,则会显示此错误。

`MultipleObjectsReturned at /john/mypage/update/` get() returned more than one Post -- it returned 2!

但如果没有其他人拥有它,则尝试更新帖子时不会显示错误。

class PostUpdateView(LoginRequiredMixin, UpdateView):
    model = Post 
    form_class = PostForm
    
    def form_valid(self, form):
        form.instance.author = self.request.user ##author = current logged in user
        return super().form_valid(form)

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


class PostDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
    model = Post 
    success_url = '/'
 
    def test_func(self):
        post = self.get_object()
        if self.request.user == post.author:
            return True 
        return False 

型号

class Post(models.Model):
        
    title = models.CharField(max_length=100, default=None)
    author = models.ForeignKey(User, on_delete=models.CASCADE)

    slug = AutoSlugField(populate_from='title', null=True)

    def get_absolute_url(self):
        return reverse('post-detail', kwargs={'slug': self.slug, 'author': self.author})

网址

urlpatterns = [

    path('landingpage/new/', PostCreateView.as_view(), name='post-create'),
    path('<str:author>/<slug:slug>/', PostDetailView.as_view(), name='post-detail'),    
    path('<str:author>/<slug:slug>/update/', PostUpdateView.as_view(), name='post-update'),
    path('<str:author>/<slug:slug>/delete/', PostDeleteView.as_view(), name='post-delete'),

] + static(settings.M

EDIA_URL、document_root=settings.MEDIA_ROOT)

【问题讨论】:

  • 这意味着有 两个 Posts 和 as slug mypage。请注意,您没有过滤Post 的作者,所以如果两个作者有一个mypage,那么这将引发错误。
  • 究竟为什么将author 存储在Post 中?
  • 在post模型里,我忘了加进去

标签: python django


【解决方案1】:

这意味着有 两个 Posts 与 as slug mypage。请注意,您没有过滤Post 的作者,所以如果两个作者有一个mypage,那么这将引发错误。

您可以使用以下方式过滤作者 slug:

class PostUpdateView(LoginRequiredMixin, UpdateView):
    model = Post 
    form_class = PostForm

    def get_queryset(self, *args, **kwargs):
        return super().get_queryset(*args, **kwargs).filter(
            author__username=self.kwargs['author']
        )
    
    def form_valid(self, form):
        form.instance.author = self.request.user
        return super().form_valid(form)

【讨论】:

  • 成功了!但是 PostDeleteView 仍然出现同样的错误
  • @sokoine:您也应该对DeleteView 应用相同的“技巧”。
猜你喜欢
  • 1970-01-01
  • 2020-08-14
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-09
  • 1970-01-01
  • 2022-01-11
相关资源
最近更新 更多