使用 get_object_or_404 时无法解压不可迭代的 int obj

cannot unpack non-iterable int obj while using get_object_or_404

我是一名新程序员,试图使用通用 CreateView 在我的项目中放入一个 "submit comment" 页面。该页面在首次加载时显示正确,但在单击表单的 "submit" 按钮后,我得到一个 "TypeError at /blog/blog/4/create - cannot unpack non-iterable int object."

这是有问题的通用视图:

class BlogCommentCreate(LoginRequiredMixin, CreateView):
    model = Comment
    template_name = 'blog/comment_create_form.html'
    fields = ['content',]

    def get_context_data(self, **kwargs):
        context = super(BlogCommentCreate, self).get_context_data(**kwargs)
        context['blogpost'] = get_object_or_404(BlogPost, pk = self.kwargs['pk'])
        return context 

    def form_valid(self, form):
        form.instance.comment_author = self.request.user
        form.instance.blogpost = get_object_or_404(BlogPost, self.kwargs['pk'])
        return super(BlogCommentCreate, self).form_valid(form)

    def get_success_url(self):
        return reverse('blogpost-detail', kwargs={'pk': self.kwargs['pk'],})

这里是相关的 url 模式。 "comment_create" 是给我表单提交问题的创建页面,"blogpost-detail" 是我尝试重定向到的地方:

urlpatterns = [
    path('blog/<int:pk>', views.BlogPostDetailView.as_view(), name='blogpost-detail'),
    path('blog/<int:pk>/create', views.BlogCommentCreate.as_view(), name='comment_create')
]

最后,这是评论模型:

class Comment(models.Model):
    date_created = models.DateField(blank=False, default = date.today)
    content = models.TextField(max_length=200)
    comment_author = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
    blogpost = models.ForeignKey('BlogPost', on_delete=models.CASCADE)

    def __str__(self):
        return self.content

我尝试过的事情: 1. 在我的 get_object_or_404 调用中重命名可能与内置 django 关键字重叠的参数(如此处另一个线程中所建议) 2. 重命名模型字段并在视图中使用大写字母。 运行 makemigrations 在此步骤之前和之后 3.(尝试 1 和 2 之后)擦除并重新创建我的博文对象 4. 去除 super() 中的参数,因为它们似乎不是必需的?

错误文本让我想到的唯一一件事是上下文可能正在接收 **kwargs 作为列表而不是一堆单独的参数。但是我对 get_context_data 或 form_valid 方法的了解还不够多,无法解决这个问题,因为我刚刚离开我找到的 Django 文档和代码片段。

您应该将 get_object_or_404 中的 pk 指定为 named 参数:

form.instance.blogpost = get_object_or_404(BlogPost, <b>pk=self.kwargs['pk']</b>)

或者更简单,将主键作为 blogpost_id:

form.instance<b>.blogpost_id = self.kwargs['pk']</b>

您可以将位置参数传递给 get_object_or_404,但这些是 Q objects [Django-doc],例如进行更复杂的过滤。