Django项目中仅首页模板可渲染,其他页面URL变但模板不变问题
嘿,刚看完你的问题,作为踩过不少Django坑的老玩家,这种情况我太熟了!咱们一步步来排查可能的原因:
路由匹配顺序/规则写错了
大概率是你应用的urls.py里路由规则写得有问题,比如把home的路由放在最前面,还没加精确匹配的结尾符$。举个反例:from django.conf.urls import url from . import views urlpatterns = [ url(r'^', views.home), # 这个规则会匹配所有以任意字符开头的请求,包括/about/、/incubator/ url(r'^about/$', views.about), url(r'^incubator/$', views.incubator), ]因为Django是按顺序匹配路由的,第一个规则会把所有请求都拦截到home视图,自然不管怎么点导航都是home的内容。修正方法很简单:给home路由加上
$,确保只匹配根路径,同时把精确路由放在前面也没问题:urlpatterns = [ url(r'^$', views.home), # 只匹配根路径/ url(r'^about/$', views.about), url(r'^incubator/$', views.incubator), ]视图函数返回了错误的模板
去检查下views.py里的about、incubator这些视图,是不是手滑返回了home的模板?比如:def about(request): return render(request, 'home.html') # 这里应该改成'about.html'才对!这种情况URL会正常变化,但渲染的还是home的内容,一定要确保每个视图对应返回自己的模板文件。
模板继承没做好
你的其他页面模板(比如about.html、incubator.html)是不是正确继承了base.html?有没有写{% extends 'base.html' %},并且把页面内容放在{% block content %}块里?如果没写对继承或者content块,可能导致渲染出来的内容和base.html完全一致,看起来像是没跳转。
给你个正确的模板示例:<!-- about.html --> {% extends 'base.html' %} {% block content %} <h1>关于我们</h1> <p>这里是关于页面的内容</p> {% endblock %}项目根路由没正确挂载应用路由
最后检查下项目根目录的urls.py,是不是把应用的路由正确包含进去了?比如:from django.conf.urls import url, include from django.contrib import admin urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^', include('你的应用名称.urls')), # 替换成你实际的应用名 ]要是没这一步,应用的路由根本不会生效,不过你说URL能变化,这个可能性相对低,但也可以确认下。
先从路由规则开始排查,这个是最常见的原因,应该很快就能解决问题啦~
内容的提问来源于stack exchange,提问作者Arjun Kashyap

