Django使用slug生成项目页面链接报NoReverseMatch错误如何解决
Django NoReverseMatch 报错排查方案
错误根本原因及修复步骤
- 模板URL调用缺失命名空间
你在urls.py中设置了app_name = 'portfolio',属于声明了URL命名空间,模板中调用视图名时必须带上命名空间前缀,格式为{% url '命名空间:视图名' %}
- 模板URL调用缺失命名空间
- URL调用未传递必填的slug参数
你的详情路由规则中定义了<slug:project_id>参数,生成跳转链接时必须传入对应项目的slug值,否则无法匹配路由
- URL调用未传递必填的slug参数
- 视图逻辑额外问题(非本次报错直接原因,但会导致后续功能异常)
- 详情视图中获取单个项目错误使用了
get_list_or_404,应该改为get_object_or_404,前者返回列表,后者返回单个项目对象 - 首页视图
project_home错误渲染了详情页模板projects/project_detail.html,需要改为你实际的首页模板文件路径
对应代码修改
模板HTML修改
将a标签的href属性修改为:
<a href="{% url 'portfolio:individual_project' project.slug %}"> <img src="{{ project.image.url }}" class="img-fluid mb-2"></a> {% endif %} <div> <h2 class= "category">{{ project.category }}</h2> <h3 class="client">{{ project.description }}</h3> <h4 class="project_type">{{ project.title }}</h4> </div>
views.py修改
from django.shortcuts import render, get_object_or_404, get_list_or_404 from .models import Project def individual_project_view(request, project_id): projectpage = get_object_or_404(Project, slug=project_id) return render(request, 'projects/project_detail.html', {'projectpage':projectpage}) def project_home(request): portfolioprojects = get_list_or_404(Project) # 此处替换为你实际的首页模板路径 return render(request, 'projects/project_home.html', {'portfolioprojects':portfolioprojects})
urls.py补充说明
只要你的项目根路由include当前应用路由时没有额外指定命名空间,保持现有app_name = 'portfolio'的配置即可正常运行。
内容的提问来源于stack exchange,提问作者Jeff Cardello
相关产品推荐
相关产品推荐

