Django中用ID而非Slug时评论链接出现404错误求助
解决Django评论功能的404和代码错误问题
我来帮你排查几个关键问题,这些应该就是导致404报错和功能失效的原因:
1. URL配置的语法混用错误
你在films/urls.py里混用了url()和path()的语法,这是导致URL匹配失败的核心问题:
url()函数需要使用正则表达式,而<int:film_id>是path()专属的路径转换器语法,不能直接用在url()里。- 推荐统一使用Django 2.0+推荐的
path()来配置URL,保持语法一致性。
修正后的films/urls.py:
from django.urls import path from . import views app_name = 'films' urlpatterns = [ path('', views.index, name='index'), # 用path()替代错误的url()写法,语法正确匹配film_id path('films/<int:film_id>/comment/', views.add_comment, name='add_comment'), path('films/<int:film_id>/', views.detail, name='detail'), ]
2. Views中的代码逻辑错误
你的add_comment视图里有两处致命错误,会导致即使URL匹配成功也报错:
- 未定义的
post变量:你写了comment.post = post,但代码里根本没有定义post,应该关联到当前获取的film对象(假设你的Comment模型外键字段是film)。 - Redirect的命名空间和参数错误:命名空间写成了
film:detail,但你的app_name是films;而且redirect不能直接传对象,需要传主键参数。
修正后的films/views.py:
from django.shortcuts import get_object_or_404, redirect, render from .models import Film from .forms import CommentForm def add_comment(request, film_id): film = get_object_or_404(Film, pk=film_id) if request.method == 'POST': form = CommentForm(request.POST) if form.is_valid(): comment = form.save(commit=False) # 修正:将评论关联到当前电影对象 comment.film = film comment.save() # 修正命名空间为films,并传递film_id参数 return redirect('films:detail', film_id=film_id) else: form = CommentForm() template = 'films/add_comment.html' # 把film传入上下文,方便模板后续扩展使用 context = {'form': form, 'film': film} return render(request, template, context)
3. 验证模板链接
你的模板链接写法是正确的:
<a href="{% url 'films:add_comment' film.id %}">Leave a comment</a>
只要你的电影对象film存在,这个标签会生成正确的URL(比如/films/2/comment/)。
最后验证步骤
- 重启Django开发服务器(避免缓存旧的URL配置)
- 点击"Leave a comment"链接,或者手动输入
http://127.0.0.1:8000/films/2/comment/ - 提交评论后,应该会正确跳转到电影详情页
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

