You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.21 00:06:03