Django项目中HTML导航链接重定向异常问题的解决方法
修复导航重定向错误的解决方案
我来帮你一步步排查和修复这个问题:
1. 修复视图中的查询集调用错误
首先看views.py里的代码,你写的ItemCategory.objects.all少了括号——all是一个方法,必须调用它才能返回查询集,否则传递给模板的只是方法对象,会导致模板渲染失败或数据无法正常显示:
修改views.py中的所有视图:
def product(request): return render(request = request, template_name = "main/categories.html", context ={"categories": ItemCategory.objects.all()}) # 补充括号 def homepage(request): return render(request = request, template_name = "main/categories.html", context ={"categories": ItemCategory.objects.all()}) # 补充括号 def about(request): return render(request = request, template_name = "main/about.html", context ={"categories": ItemCategory.objects.all()}) # 补充括号 def contact(request): return render(request = request, template_name = "main/contact.html", context ={"categories": ItemCategory.objects.all()}) # 补充括号
2. 修复导航栏的URL引用问题
你的urls.py里设置了app_name = "main",所以在模板中使用{% url %}标签时必须加上命名空间;同时,*硬编码的相对路径(比如about/)*会导致在子页面点击时出现错误跳转(比如在product/页面点击会跳到product/about/,而不是根目录的/about/)。
修改navbar.html的链接,统一使用带命名空间的{% url %}标签:
<nav> <div id="nav-wrapper"> <div> <ul class="center hide-on-med-and-down"> <li> <a href="{% url 'main:homepage' %}">Home</a> </li> <li> <a href="{% url 'main:about' %}">About Us</a> </li> <li> <a href="{% url 'main:product' %}">Products</a> </li> <!-- 注意:Services链接目前在urls.py中没有对应的路由,要么添加视图和路由,要么暂时注释/移除 --> <!-- <li> <a href="services/">Services</a> </li> --> <li> <a href="{% url 'main:contact' %}">Contact</a> </li> <li> <a class='dropdown-trigger btn' href='#' data-target='dropdown1'>Drop Me!</a> </li> </ul> </div> </div> </nav>
如果需要保留Services链接,你需要:
- 在
views.py中添加对应的视图:
def services(request): return render(request, "main/services.html", {"categories": ItemCategory.objects.all()})
- 在
urls.py的urlpatterns里添加路由:
path("services/", views.services, name="services"),
- 最后把导航里的Services链接改成:
<a href="{% url 'main:services' %}">Services</a>
3. 验证路由顺序(可选但推荐)
你的urls.py最后有一个<single_slug>的路由,它会匹配任何未被前面路由匹配的路径。目前它已经放在路由列表的最后,这个顺序是正确的——确保具体路由(比如about/、product/)先被匹配,避免意外的错误匹配。
4. 测试验证
做完以上修改后,重启Django开发服务器,点击导航栏的链接就能正常跳转了。如果还有问题,可以查看浏览器控制台的错误状态码:404代表路由未匹配,500代表视图代码有错误,根据提示进一步排查即可。
内容的提问来源于stack exchange,提问作者Umang Vira
相关产品推荐
相关产品推荐

