这里有个问题:页面的设计写死在视图函数的代码里的。如果你想改变页面的样子,你需要编辑 Python 代码。所以让我们使用 Django 的模板系统,只要创建一个视图,就可以将页面的设计从代码中分离出来。
首先,在你的 polls
目录里创建一个 templates
目录。Django 将会在这个目录里查找模板文件。
你项目的 TEMPLATES
配置项描述了 Django 如何载入和渲染模板。默认的设置文件设置了 DjangoTemplates
后端,并将 APP_DIRS
设置成了 True。这一选项将会让 DjangoTemplates
在每个 INSTALLED_APPS
文件夹中寻找 "templates" 子目录。这就是为什么尽管我们没有像在第二部分中那样修改 DIRS 设置,Django 也能正确找到 polls 的模板位置的原因。
在你刚刚创建的 templates
目录里,再创建一个目录 polls
,然后在其中新建一个文件 index.html
。换句话说,你的模板文件的路径应该是 polls/templates/polls/index.html
。因为 Django 会寻找到对应的 app_directories
,所以你只需要使用 polls/index.html
就可以引用到这一模板了。
模板命名空间
虽然我们现在可以将模板文件直接放在 polls/templates
文件夹中(而不是再建立一个 polls
子文件夹),但是这样做不太好。Django 将会选择第一个匹配的模板文件,如果你有一个模板文件正好和另一个应用中的某个模板文件重名,Django 没有办法 区分 它们。我们需要帮助 Django 选择正确的模板,最简单的方法就是把他们放入各自的 命名空间 中,也就是把这些模板放入一个和 自身 应用重名的子文件夹里。
在我看来,因为settings的文件夹中出现了如下情况
Django配置文件中挂载各APP
myproject/myproject/settings.py中的变量INSTALLED_APPS
该变量的值是一个list,给出在Django项目中包含的Django应用。
Django框架默认情况下,Django项目中包含如下Django应用
INSTALLED_APPS = [
'django.contrib.admin', 站点管理系统
'django.contrib.auth', 认证系统
'django.contrib.contenttypes', content types框架
'django.contrib.sessions', session框架
'django.contrib.messages', message框架
'django.contrib.staticfiles', 静态文件管理框架
]
所以这个在mysite这个文件夹下,polls和installed_app里面配置的基础模块是并行的app,而上面django的官方文档又在polls里的template文件夹里再新建polls文件夹,里面存放html相应视图。上面说这么做的原因是有其他app里的同名文件会导致查找错误,也就是说在template这个文件夹下可能存着别的app的html视图文件。
这一点让我很迷惑,如果说不同的app用不同名字的文件夹区分,他们应该在mysite这个文件夹里就区分开了,为什么会在polls这个app的文件夹里找到别的app的html视图文件,查找的时候已经索引到polls的template,或许是查找方式的问题?