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 进行定义,如下所示:

  1. from django.db import models
  2. from django.contrib.sites.models import Site
  3. class FlatPage(models.Model):
  4. url = models.CharField(max_length=100, db_index=True)
  5. title = models.CharField(max_length=200)
  6. content = models.TextField(blank=True)
  7. enable_comments = models.BooleanField()
  8. template_name = models.CharField(max_length=70, blank=True)
  9. registration_required = models.BooleanField()
  10. 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来存取简单页面对象,例如

  1. >>> from django.contrib.flatpages.models import FlatPage
  2. >>> from django.contrib.sites.models import Site
  3. >>> fp = FlatPage.objects.create(
  4. ... url='/about/',
  5. ... title='About',
  6. ... content='<p>About this site...</p>',
  7. ... enable_comments=False,
  8. ... template_name='',
  9. ... registration_required=False,
  10. ... )
  11. >>> fp.sites.add(Site.objects.get(id=1))
  12. >>> FlatPage.objects.get(url='/about/')
  13. <FlatPage: /about/ -- About>

使用简单页面模

缺省情况下,系统使用模板 flatpages/default.html 来解析简单页面,但你也可以通过设定 FlatPage 对象?template_name 字段来更改特定简单页面的模板

你必须自己创?flatpages/default.html 模板?只需要在模板目录创建一?flatpages 目录,并?default.html 文件置于其中

简单页面模板只接受有一个上下文变量—?flatpage ,也就是该简单页面对象

以下是一?flatpages/default.html 模板范例:

  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"
  2. "http://www.w3.org/TR/REC-html40/loose.dtd">
  3. <html>
  4. <head>
  5. <title>{{ flatpage.title }}</title>
  6. </head>
  7. <body>
  8. {{ flatpage.content|safe }}
  9. </body>
  10. </html>

注意我们使用?tt class="docutils literal">safe模板过滤器来允许flatpage.content引入原始HTML而不必转义