Flatpages(简单页?
尽管通常情况下总是搭建运行数据库驱动的 Web 应用,有时你还是需要添加一两张一次性的静态页面,例如“关于”页面,或者“隐私策略”页面等等?可以用像 Apache 这样的标准Web服务器来处理这些静态页面,但却会给应用带来一些额外的复杂性,因为你必须操心怎么配置 Apache,还要设置权限让整个团队可以修改编辑这些文件,而且你还不能使用 Django 模板系统来统一这些页面的风格
这个问题的解决方案是使用位于 django.contrib.flatpages
开发包中的 Django 简单页面(flatpages)应用程序。该应用让你能够通过 Django 管理站点来管理这些一次性的页面,还可以让你使用 Django 模板系统指定它们使用哪个模板?它在后台使用Django模型,这意味着它把页面项别的数据一样保存在数据库中,也就是说你可以使用标准Django数据库API来存取页面
简单页面以它们?URL 和站点为键值?当创建简单页面时,你指定它与哪个URL以及和哪个站点相关联 ?(有关站点的更多信息,请查阅”多站点“一节。)
使用简单页
安装简单页面应用程序必须按照下面的步骤
添加
'django.contrib.flatpages'
?INSTALLED_APPS
设置?tt class="docutils literal">django.contrib.flatpages依赖django.contrib.sites
,所以确保它们都?tt class="docutils literal">INSTALLED_APPS里?
'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'
添加?MIDDLEWARE_CLASSES
设置中运行
manage.py syncdb
命令在数据库中创建必需的两个表
简单页面应用程序在数据库中创建两个表: django_flatpage
?django_flatpage_sites
?django_flatpage
只是?URL 映射到标题和一段文本内容?django_flatpage_sites
是一个多对多表,用于关联某个简单页面以及一个或多个站点
该应用捆绑的 FlatPage
模型?django/contrib/flatpages/models.py
进行定义,如下所示:
from django.db import models
from django.contrib.sites.models import Site
class FlatPage(models.Model):
url = models.CharField(max_length=100, db_index=True)
title = models.CharField(max_length=200)
content = models.TextField(blank=True)
enable_comments = models.BooleanField()
template_name = models.CharField(max_length=70, blank=True)
registration_required = models.BooleanField()
sites = models.ManyToManyField(Site)
让我们逐项看看这些字段的含义:
url
: 该简单页面所处的 URL,不包括域名,但是包含前导斜?(例如/about/contact/
)title
: 简单页面的标题?框架不对它作任何特殊处理?由你通过模板来显示它content
: 简单页面的内容 (?HTML 页面)?框架不对它作任何特殊处理?由你负责使用模板来显示enable_comments
: 是否允许该简单页面使用评论?框架不对它作任何特殊处理?你可在模板中检查该值并根据需要显示评论窗体template_name
: 用来解析该简单页面的模板名称?这是一个可选项;如果未指定模板或该模板不存在,系统会退而使用默认模?flatpages/default.html
registration_required
: 是否注册用户才能查看此简单页面?该设置项集成?Djangos 验证/用户框架,该框架于第十四章详述sites
: 该简单页面放置的站点?该项设置集成?Django 多站点框架,该框架在本章的“多站点”一节中有所阐述
你可以通过 Django 超级管理界面或?Django 数据?API 来创建简单页面?要了解更多内容,请查阅“添加、修改和删除简单页面”一节
一旦简单页面创建完成, FlatpageFallbackMiddleware
将完成(剩下)所有的工作?每当 Django 引发 404 错误,作为最后的办法,该中间件将根据所请求?URL 检查简单页面数据库?确切地说,它将使用所指定?URL以及 SITE_ID
设置对应的站?ID 查找一个简单页面
如果找到一个匹配项,它将载入该简单页面的模板(如果没有指定的话,将使用默认模?flatpages/default.html
)?同时,它把一个简单的上下文变?tt class="docutils literal">flatpage(一个简单页面对象)传递给模板?模板解析过程中,它实际用的是RequestContext
如果 FlatpageFallbackMiddleware
没有找到匹配项,该请求继续如常处理
注意
该中间件仅在发生 404 (页面未找到)错误时被激活,而不会在 500 (服务器错误)或其他错误响应时被激活?还要注意的是必须考虑 MIDDLEWARE_CLASSES
的顺序问题?通常,你可以?FlatpageFallbackMiddleware
放在列表最后,因为它是最后的办法
添加、修改和删除简单页
可以用两种方式增加、变更或删除简单页面:
通过超级管理界面
如果已经激活了自动?Django 超级管理界面,你将会在超级管理页面的首页看到有个 Flatpages 区域?你可以像编辑系统中其它对象那样编辑简单页面
通过 Python API
前面已经提到,简单页面表现为 django/contrib/flatpages/models.py
中的标准 Django 模型。这样,你就可以使用Django数据库API来存取简单页面对象,例如
>>> from django.contrib.flatpages.models import FlatPage
>>> from django.contrib.sites.models import Site
>>> fp = FlatPage.objects.create(
... url='/about/',
... title='About',
... content='<p>About this site...</p>',
... enable_comments=False,
... template_name='',
... registration_required=False,
... )
>>> fp.sites.add(Site.objects.get(id=1))
>>> FlatPage.objects.get(url='/about/')
<FlatPage: /about/ -- About>
使用简单页面模
缺省情况下,系统使用模板 flatpages/default.html
来解析简单页面,但你也可以通过设定 FlatPage
对象?template_name
字段来更改特定简单页面的模板
你必须自己创?flatpages/default.html
模板?只需要在模板目录创建一?flatpages
目录,并?default.html
文件置于其中
简单页面模板只接受有一个上下文变量—?flatpage
,也就是该简单页面对象
以下是一?flatpages/default.html
模板范例:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
"http://www.w3.org/TR/REC-html40/loose.dtd">
<html>
<head>
<title>{{ flatpage.title }}</title>
</head>
<body>
{{ flatpage.content|safe }}
</body>
</html>
注意我们使用?tt class="docutils literal">safe模板过滤器来允许flatpage.content
引入原始HTML而不必转义