Django2模板配置问题:多子应用模板指向错误如何修正?
嘿,我来帮你搞定这个路由和模板指向的问题!你遇到的情况大概率是路由分发没做对,或者模板的存放路径有冲突,咱们一步步来调整:
第一步:确认正确的目录结构
首先得保证模板的存放路径不冲突,Django查找模板时如果两个子应用的模板都直接放在templates/根目录下,重名的index.html会被优先匹配到先注册的应用,所以必须给每个子应用的模板单独建同名子目录:
django_site/ ├── django_site/ │ ├── __init__.py │ ├── settings.py │ ├── urls.py │ └── wsgi.py ├── site1/ │ ├── __init__.py │ ├── apps.py │ ├── templates/ │ │ └── site1/ # 必须加这个子目录 │ │ └── index.html │ ├── urls.py │ └── views.py ├── polls/ │ ├── __init__.py │ ├── apps.py │ ├── templates/ │ │ └── polls/ # 同理加这个子目录 │ │ └── index.html │ ├── urls.py │ └── views.py └── manage.py
第二步:配置django_site/settings.py
- 注册子应用:确保
INSTALLED_APPS里同时包含site1和polls,推荐用应用配置类的方式注册:
INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'site1.apps.Site1Config', # 或者直接写'site1',前者更规范 'polls.apps.PollsConfig', ]
- 开启子应用模板查找:确保
TEMPLATES里的APP_DIRS设为True,这样Django会自动去每个注册应用的templates目录找模板:
TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], # 没有项目级模板的话留空即可 'APP_DIRS': True, # 这个是关键,必须设为True 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', ], }, }, ]
第三步:配置主项目的urls.py(django_site/urls.py)
这里要把不同前缀的请求分发给对应的子应用,用include来实现路由分发:
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('site1/', include('site1.urls')), # 把/site1/开头的请求交给site1的urls处理 path('polls/', include('polls.urls')), # 把/polls/开头的请求交给polls的urls处理 ]
第四步:配置子应用的路由与视图
先处理site1:
- site1/views.py:编写视图函数,指定渲染
site1/index.html模板:
from django.shortcuts import render def index(request): # 这里必须写site1/index.html,而不是直接index.html return render(request, 'site1/index.html')
- site1/urls.py:配置子应用内部的路由,把空路径(对应
/site1/)指向上面的视图:
from django.urls import path from . import views urlpatterns = [ path('', views.index, name='site1_index'), ]
再处理polls(确保和site1对应):
- polls/views.py:
from django.shortcuts import render def index(request): return render(request, 'polls/index.html')
- polls/urls.py:
from django.urls import path from . import views urlpatterns = [ path('', views.index, name='polls_index'), ]
关键注意点
- 模板路径一定要加子应用名称前缀(比如
site1/index.html),不然Django会找到第一个匹配的重名模板 - 主urls里的
include必须正确对应子应用的urls.py,别写错应用名称 - 确保子应用已经在INSTALLED_APPS里注册,不然Django不会去它的templates目录找模板
现在重启Django服务,访问localhost:8000/site1应该就能看到site1的index.html,localhost:8000/polls看到polls的了!
内容的提问来源于stack exchange,提问作者mommomonthewind
相关产品推荐
相关产品推荐

