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
相关产品推荐
相关产品推荐

