本节教程接着 第5部分 ,我们构建了一个经过测试的 Web 投票应用, 现在我们会添加一张表格和一张图片。
除了服务端生成的 HTML , 通常 Web 应用还需要提供额外的一些文件——例如图片、 JavaScript 代码, 或者 CSS 样式表 —— 以便渲染完整的 Web 页面,在 Django 中,我们将这些文件称为“静态资源文件”。
对那些小项目,这显得并不特别重要,因为您可以将这些文件放在任何 Web 服务器可以找到的地方, 但是在大型项目中——尤其是那些由好几个应用组成的站点——在这种情况下,需要花更多的精力来处理 由每个应用提供的静态资源文件。
这也正是 django.contrib.staticfiles 模块的目标:它会搜集每个应用提供的静态资源文件
(包括其他您指定的位置),并将这些文件放到一个统一的位置,以便产品发布时可以引用。
首先,在您的 polls 文件夹中创建一个 static 目录, Django 稍后会从这里寻找静态资源文件,
就像会从 polls/templates/ 寻找模板文件那样。
Django 的配置项 STATICFILES_FINDERS 包含了一个需要如何查找静态资源文件的
检索器列表。默认提供了一个 AppDirectoriesFinder ,它的工作方式即从每个 INSTALLED_APPS
中安装的应用下的 “static” 子目录收集静态资源文件。管理站点模块也是通过这种方式来搜集其提供的
静态资源文件。
在您刚刚创建的 static 文件夹中,创建一个叫 polls 的文件夹,并在里面创建一个文件 style.css 。
换句话说,您的样式表文件应该位于 polls/static/polls/style.css 。因为 AppDirectoriesFinder
的工作方式,您可以在模板文件中使用 polls/style.css 来引用该文件。
静态资源文件名字空间
就像模板文件那样,我们可能直接将静态资源文件放入 polls/static (而不是再创建一个 polls
子目录),但这不是一个好主意。 Django 会选中那些第一个命中的静态资源文件,如果您在另一个
* 不同 * 的应用中也存在一个一模一样名字的文件, Django 并不会区分它们。我们需要告诉 Django
选择正确的那个,要满足这种场景,最简单的方式就是通过 * 名字空间 * 划分。也就是,
通过将不同静态资源文件放入根据应用命名的目录,来界定应用中具体选择的静态资源文件。
在样式表 (polls/static/polls/style.css) 中放入下面:
li a {
color: green;
}
接着,在 polls/templates/polls/index.html 的头部加入:
{% load static %}
<link rel="stylesheet" type="text/css" href="{% static 'polls/style.css' %}" />
模板标签 {% static %} 会生成该静态资源文件的绝对 URL 。
这就是您所要做的全部的开发工作。重新刷新 http://localhost:8000/polls/ 然后您会看到
问题链接变成绿色了( Django 的样式!),说明您的样式表已经生效了。
接下去,我们要创建一个放置图片的子目录,在 polls/static/polls/ 中创建一个 images
子文件夹,在这个目录中,放置一张图片 background.gif 。换句话说,这张图片的路径是
polls/static/polls/images/background.gif 。
接着,修改您的样式表 (polls/static/polls/style.css) :
body {
background: white url("images/background.gif") no-repeat right bottom;
}
重新刷新 http://localhost:8000/polls/ ,您应该就能在屏幕底部的右侧看到我们的背景图案了。
警告
当然您无法在那些并不是由 Django 生成的静态资源文件像是刚才的样式表中使用 {% static %}
模板标签,您应该这些静态资源文件中总是使用 ** 相对路径 ** 来链接其他静态资源文件,这样在您
稍后可能修改了 STATIC_URL (使用 static 模板标签生成它们的 URL )后,
并不需要在您的静态资源文件中修改大量的路径。
这些都是 ** 基础知识 ** 。想要了解更多的细节,请参考 :doc:` 静态资源文件入门 </howto/static-files/index>` 和 :doc:` 静态资源文件指南 </ref/contrib/staticfiles>` 。如果想了解如何将您的静态资源文件发不到 真实的服务器上请阅读 :doc:` 部署静态资源文件 </howto/static-files/deployment>` 。
如果您对静态资源文件已经建立了初步印象,请阅读 :doc:` 第7部分 </intro/tutorial07-zh>` 来了解 如何定制我们自动生成的管理站点。
9月 10, 2017