Django使用UpdateView时报get()意外关键字参数pk_news错误如何解决
问题根因
- 第一个错误:你错误重写了
UpdateView的get()方法
Django 类视图的get()方法默认需要接收路由传递的所有命名路径参数,你自定义的get()只定义了request一个入参,路由传过来的pk_news没有对应接收位,直接触发参数不匹配错误。同时get()方法要求返回HttpResponse类型的响应,你直接返回ORM查询的Comment实例也不符合规范,会导致后续渲染逻辑异常。 - 第二个错误:路径参数取值逻辑错误
你写在路由path里的<int:pk_news>、<int:pk>属于路径参数,存放在视图的self.kwargs属性中,不是GET查询参数,不能用self.request.GET.get()来取值。 - 第三个错误:ORM查询条件字段大概率不匹配
除非你的Comment模型确实定义了名为pk_news的字段,否则pk_news=xxx的查询条件本身就是非法的。正常Comment关联News外键的场景下,查询条件应该写news_id=xxx或者news__id=xxx。 - 额外问题:你在视图里写的
get_absolute_url方法不会生效,这个是模型类的方法,视图控制提交成功后的跳转应该用get_success_url方法。
修正方案
不需要重写get()方法,要自定义查询逻辑应该重写get_object()方法,修正后的视图代码如下:
class NewsCommentsUpdateView(LoginRequiredMixin, UserPassesTestMixin, UpdateView): model = Comment fields = ('comment',) template_name = 'news/comment_edit.html' def get_success_url(self): return reverse_lazy('news_detail', args=[str(self.object.news.id)]) def get_object(self, queryset=None): return Comment.objects.get(news_id=self.kwargs['pk_news'], pk=self.kwargs['pk']) def test_func(self): obj = self.get_object() return self.request.user.has_perm('news.all') or self.request.user.has_perm('news.delete_news') or obj.author == self.request.user
内容的提问来源于stack exchange,提问作者ali ardakani
相关产品推荐
相关产品推荐

