目录
编写第一个Django应用程序,第六部分
我们已经构建了一个经过测试的web-poll应用程序,现在我们将为它添加样式表和图像。
除了服务器生成的HTML之外,web应用程序通常还需要提供额外的文件——比如图像、JavaScript或CSS——以呈现完整的web页面。在Django中,我们把这些文件称为“静态文件”。
对于小型项目,这不是什么大问题,因为你可以将静态文件保存在web服务器可以找到的地方。然而,在更大的项目中——尤其是那些由多个应用程序组成的项目——处理每个应用程序提供的多组静态文件就不是那么容易的了。
我们为了管理静态文件使用django.contrib.staticfiles,它的作用是:将来自每个应用程序(以及你指定的任何其它位置)的静态文件集中到一个可以在生产环境中轻松提供服务的位置。
自定义应用程序的外观
首先,在polls文件夹下创建一个名为static的文件夹,Django将在那里查找静态文件,类似于Django在polls/templates/中查找模板。
Django的STATICFILES_FINDERS设置了一个查找器列表,这些查找器知道如何从各种来源中发现静态文件。其中的一个默认AppDirectoriesFinder将会在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)中添加以下内容:
li a {
color: green;
}
接下来,在polls/templates/polls/index.html中使用该CSS:
{% load static %}
<link rel="stylesheet" href="{% static 'polls/style.css' %}">
{% static %}模板标签生成静态文件的绝对URL。这就是静态文件开发所需要的全部内容。
现在,让我们启动开发服务器,浏览一下使用了样式的网页内容:
python manage.py runserver
访问http://localhost:8000/polls/,你会看到问题链接是绿色的,这意味着我们的样式表被正确加载了。
添加背景图像
接下来,我们将为图像创建一个子目录。在polls/static/polls/文件夹下创建images子文件夹,在该文件夹中,添加一张你喜欢的图片作为背景图片。为了表明图片的含义,我们把图片命名为background.jpg,它的全路径为polls/static/polls/images/background.jpg。
然后,在样式表中添加对图像的引用(polls/static/polls/style.css):
body {
background: white url("images/background.jpg") no-repeat;
}
再次访问http://localhost:8000/polls/,你会看到网页已经被加上了背景。
欢迎关注我的公众号