我是一名新程序员,尝试使用通用 CreateView 在我的项目中放入“提交评论”页面。页面首次加载时显示正常,但单击表单的“提交”按钮后,我收到“/blog/blog/4/create 处的 TypeError - 无法解压不可迭代的 int 对象。”
这是有问题的通用 View :
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. 重命名模型字段并在 View 中使用大写。在这一步之前和之后运行 makemigrations 3.(尝试 1 和 2 后)删除并重新创建我的 blogpost 对象 4. 去掉 super() 中的参数,因为看起来它们可能没有必要?
错误文本让我想到的唯一一件事是上下文可能会接收 **kwargs 作为列表而不是一堆单独的参数。但我对 get_context_data 或 form_valid 方法了解不够,无法解决此问题,因为我只是查看我找到的 Django 文档和代码片段。
最佳答案
您应该将 get_object_or_404
中的 pk
指定为命名参数:
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] ,例如进行更复杂的过滤。
关于django - 使用 get_object_or_404 时无法解压不可迭代的 int obj,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62398710/