这个教程紧接教程(5).我们已经建立了一个网页问卷调查应用,我们现在将添加一个样式表和一个图片。除了服务器生成的HTML外,web应用程序通常需要添加额外的文件 -- 例如图片,JavaScript,或者CSS -- 必须的用于渲染完成的网页页面。在Django中,我们将这些文件称为“静态文件”。
对于小一些的项目,这不是什么大问题,因为你可以将静态文件放在你web服务器能找到的地方。然后,在大的项目中,尤其是由多个应用组成的 -- 处理多个由每个应用提供的静态文件集开始变得棘手。
那就是django.contrib.staticfiles的目的:它从每个你的应用中搜集静态文件(和你指定的任何地方)到一个可以很容易在生产中服务的地址。
1. 定制你应用的外观和感觉
首先,在你的polls路径下创建一个目录名为static。Django将会在那里寻找静态文件,和Django如何在polls/templates/中找到模板相似。
Django的STATICFILES_FINDERS设置包含了发现者的列表,它知道如何去从可变的源中发现静态文件。默认中的一个是AppDerectoriesFinder,它在每个INSTALLED_APPS寻找“static”子目录,就像我们刚刚在polls中创建的那个。管理站点为它的静态文件使用相同的目录结构。
在你刚刚创建的static路径下,创建另一个目录名为polls,并且在那里面创建一个文件称为style.css。换句话说,你的
样式表应该在polls/static/polls/style.css。因为AppDirectoriesFinder静态文件查找器的工作方式,你可以在Django中用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/你将会看到questions的链接都是绿色的(Django的风格!),这意味着你的样式表被正确的加载了。
2. 添加背景图片
下一步,我们将创建一个存放图片的子路径。在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/你将会看到加载在屏幕右下角的背景图片。
警告
当然{% static %}模板标签不能用在像你的样式表这样的静态文件中,因为他们不是Django生成的。你应该总是使用相对路径来链接你的静态文件,因为你可以修改STATIC_URL(被static模板标签用于生成它的URLs)而不用修改在你静态文件中的大量的路径。
这些是基础。有关设置和框架中包含其他部分的详细信息请阅读<静态文件操作方式>和<静态文件指引>。<部署静态文件>讨论如何使用静态文件在一个真正的服务器上。