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

Django视图转类视图后提交评论出现404错误求助

问题原因分析

你遇到404错误的核心原因是选错了基类视图:RedirectView的设计目的只是处理重定向逻辑,它完全没有内置处理表单渲染、表单提交验证的能力。你把原本属于CreateView的配置(比如model、form_class、template_name)和方法(form_valid)硬套在RedirectView上,完全不匹配它的生命周期逻辑,导致整个视图根本无法正常工作,自然触发404错误。

具体来说,你的CommentCreateView(RedirectView)有几个致命问题:

  • RedirectView不会处理GET请求来渲染模板,当你访问添加评论的页面时,它默认会执行重定向逻辑,但你没配置合法的跳转目标,直接返回404。
  • form_valid是FormMixin(被CreateView继承)专属的方法,RedirectView的生命周期里根本不会调用这个方法,等于这段代码完全是无效的。
  • 你在form_valid里用到的form变量甚至都没定义,就算这个方法被调用,也会直接抛出NameError。
正确的解决方案:使用CreateView(而非RedirectView)

其实你自己写的临时方案已经摸到了正确方向,但可以更简洁——不需要手动重写get和post方法,CreateView已经帮你封装好了这些通用逻辑,只需要正确配置属性并重写form_valid来关联评论和文章即可:

from django.views.generic.edit import CreateView
from django.urls import reverse
from django.shortcuts import get_object_or_404, redirect
from .models import Comment, Article
from .forms import CommentForm

class CommentCreateView(CreateView):
    model = Comment
    form_class = CommentForm
    template_name = 'news/add_comment_to_article.html'

    def form_valid(self, form):
        # 从URL参数中获取对应的文章实例
        article = get_object_or_404(Article, pk=self.kwargs.get('pk'))
        # 将评论与文章关联
        form.instance.post = article
        # 调用父类方法完成评论保存
        super().form_valid(form)
        # 重定向到文章详情页
        return redirect(reverse('news:article', kwargs={'article_id': article.pk}))

    # 也可以用更简洁的方式,直接重写成功跳转地址:
    # def get_success_url(self):
    #     article = get_object_or_404(Article, pk=self.kwargs.get('pk'))
    #     return reverse('news:article', kwargs={'article_id': article.pk})
为什么这个方案可行?
  • CreateView继承了FormMixin和TemplateResponseMixin,天然支持GET请求渲染表单模板、POST请求处理表单验证与保存的完整流程。
  • form_valid方法会在表单验证通过后被自动调用,我们只需要在这里完成评论与文章的关联逻辑即可。
  • 它完全复用了Django通用视图的成熟逻辑,比手动重写get/post更简洁、更符合Django最佳实践。
最后确认URL配置

要确保你的URL配置和视图参数匹配,比如news应用下的urls.py:

from django.urls import path
from .views import CommentCreateView, article_detail

app_name = 'news'

urlpatterns = [
    # 文章详情页,接收article_id参数
    path('article/<int:article_id>/', article_detail, name='article'),
    # 添加评论的URL,接收文章pk参数,对应视图的pk kwargs
    path('article/<int:pk>/comment/', CommentCreateView.as_view(), name='add_comment'),
]

这样访问/article/1/comment/时,视图会正常渲染评论表单,提交后关联pk=1的文章,最终重定向到文章详情页。

内容的提问来源于stack exchange,提问作者Sandi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:04:19