【问题标题】:type object 'Post' has no attribute 'filter'类型对象“帖子”没有属性“过滤器”
【发布时间】:2021-11-11 23:58:23
【问题描述】:

每次我尝试对帖子发表评论时,我都会在帖子编号处收到 AttirbuteError。例如 - 'AttributeError at /post/54/',在此下方它说'type object'Post'没有属性'filter''。然后它将我引导到我的 views.py 第 58 行,内容为:post = self.get_object(Post)。它是我的 PostDetailClass 的一部分:

class PostDetailView(DetailView):
    model = Post
    
    form = CommentForm
    
    def post(self, request, *args, **kwargs):
        form = CommentForm(request.POST)
        if form.is_valid():
            post = self.get_object(Post)
            form.instance. user = request.user
            form.instance.post = post
            reply_id = request.POST.get('comment_id')
            comment_qs = None
            if reply_id:
                comment_qs = Comment.objects.get(id=reply_id)
            reply = comment_qs, reply=None
            form.save()
            form.save_m2m()

            return redirect(reverse("post", kwargs={
                'content': Post.content
            }))


urls.py

    from django.urls import path
    from django.conf import settings
    from django.conf.urls.static import static
    from django.urls.conf import re_path
    from django.views.generic.base import RedirectView
    from .views import ( 
        PostListView, 
        PostDetailView, 
        PostCreateView,
        PostDeleteView,
        UserPostListView,
        TagIndexView,
        about,
    )
    from . import views

    urlpatterns = [
        path('', PostListView.as_view(), name='blog-home'),
        path('post/<int:pk>/', PostDetailView.as_view(), name='post- 
   detail'),
        path('user/<str:username>', UserPostListView.as_view(), 
    name='user-posts'),
        path('post/new', PostCreateView.as_view(), name='post-create'),
        path('about/', views.about, name='blog-about'),
        path('map/', views.map, name='blog-map'),
        path('post/<int:pk>/delete/', PostDeleteView.as_view(), 
    name='post-delete'),
        path('latest-posts/', views.latest_posts, name='latest-posts'),
        path('focused/', views.focused, name='focused'),
        path('snakegame/',views.snake_game, name='snake-game'),
        re_path(r'^tag/(?P<slug>[-\w]*)/$',TagIndexView.as_view(), 
    name='tagged')

    ]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

谁能指出我的代码有什么问题?谢谢。

【问题讨论】:

  • 能否分享您的urls.py文件代码

标签: python html django


【解决方案1】:

问题来自将Post 传递给self.get_object()。 get_object 接受一个查询集作为它的参数。一个查询集对象应该有.filter(),但没有Post。

在这种情况下,您实际上不需要向self.get_object 传递任何内容。当您不向其传递任何内容时,查询集默认为 self.get_queryset()。

简而言之,将该行更改为:

post = self.get_object()

【讨论】:

  • 我这样做了,现在我得到“/post/54/ 处的 TypeError”,它说,“无法解压缩不可迭代的 NoneType 对象”。这是什么意思?
  • @RenaldoRafael 那是因为reply = comment_qs, reply=None这行,这是什么意思?另一个问题是你的代码中的Post.content,可能你打算在那里写post.content(注意p的大写)。
【解决方案2】:

您应该首先尝试获取 post 对象,如下所示:-

object_id = self.kwargs[self.pk_url_kwarg]
post = self.model.objects.get(id=object_id)

在您的发布方法中:-

def post(self, request, *args, **kwargs):
    form = CommentForm(request.POST)
    if form.is_valid():
        object_id = self.kwargs[self.pk_url_kwarg]
        post = self.model.objects.get(id=object_id)
        form.instance.user = request.user
        form.instance.post = post
        reply_id = request.POST.get('comment_id')
        comment_qs = None
        if reply_id:
            comment_qs = Comment.objects.get(id=reply_id)
        reply = comment_qs, reply=None
        form.save()
        form.save_m2m()

        return redirect(reverse("post", kwargs={
            'content': post.content
        }))

【讨论】:

    猜你喜欢
    • 2012-12-02
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 2021-07-03
    • 2020-02-01
    • 2019-10-05
    相关资源
    最近更新 更多