编写您的第一个Django应用, 第6部分

本节教程接着 第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) 中放入下面:

polls/static/polls/style.css
li a {
    color: green;
}

接着,在 polls/templates/polls/index.html 的头部加入:

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) :

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>` 来了解 如何定制我们自动生成的管理站点。