Django有一个可选的“简单页面”的应用它可以让你存储简单的扁平化结构的HTML内容在数据库中,你可以通过Django的管理界面和一个Python API处理要管理内容。

一个浮动页面是一个简单的包含有URL,标题和内容的对象。使用它作为一次性的,特殊用途的页面,比如“关于我们”或者“隐私政策”的页面,那些你想要保存在数据库,但是你又不想开发一个自定义的Django应用。

一个简单的页面应用程序可以使用自定义模板或者默认模板,系统的单页面模板。它可以和一个或多个站点相关联。

如果您希望将内容放在自定义模板中,该内容字段可能会任意的留下空白。

这里有一些基于Django的简单页面的示例:

安装

按照下面这些步骤,安装单页面的应用

  1. 通过向您的INSTALLED_APPS添加'django.contrib.sites',安装sites framework
    另外,请确保您已将SITE_ID正确设置为设置文件所代表的网站的ID。这通常是1(即SITE_ID = 1重新使用sites框架来管理多个网站,它可以是不同网站的ID。

  2. 'django.contrib.flatpages'添加到您的INSTALLED_APPS设置。

然后:

  1. 在URLconf中添加条目。例如:
    1. urlpatterns = [
    2. url(r'^pages/', include('django.contrib.flatpages.urls')),
    3. ]

要么:

  1. 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'添加到您的MIDDLEWARE_CLASSES设置。
  2. 运行命令manage.py migrate

怎么运行的

manage.py migrate在数据库中创建两个表:django_flatpagedjango_flatpage_sitesdjango_flatpage是一个简单的查找表,只是将URL映射到标题和一堆文本内容。django_flatpage_sites将平面页面与网站相关联。

使用URLconf

有多种方法可以将平面网页纳入您的URLconf。您可以将特定路径专用于平面页面:

  1. urlpatterns = [
  2. url(r'^pages/', include('django.contrib.flatpages.urls')),
  3. ]

您还可以将其设置为“总线”模式。在这种情况下,将模式放置在其他url模式的末尾非常重要:

  1. from django.contrib.flatpages import views
  2. # Your other patterns here
  3. urlpatterns += [
  4. url(r'^(?P<url>.*/)$', views.flatpage),
  5. ]

警告

如果您将APPEND_SLASH设置为False,则必须删除catchall模式中的斜杠,否则不会匹配尾部斜杠。

另一个常见的设置是为一组有限的已知网页使用平面网页,并对网址进行硬编码,因此您可以使用url模板标记来引用它们:

  1. from django.contrib.flatpages import views
  2. urlpatterns += [
  3. url(r'^about-us/$', views.flatpage, {'url': '/about-us/'}, name='about'),
  4. url(r'^license/$', views.flatpage, {'url': '/license/'}, name='license'),
  5. ]

使用中间件

FlatpageFallbackMiddleware可以完成所有的工作。

class FlatpageFallbackMiddleware[source]

每次任何Django应用程序引发404错误,此中间件检查flatpages数据库的请求的URL作为最后手段。Specifically, it checks for a flatpage with the given URL with a site ID that corresponds to the SITE_ID setting.

如果找到匹配,则遵循此算法:

  • 如果flatpage有一个自定义模板,它将加载该模板。否则,它会加载模板flatpages/default.html
  • 它传递那个模板一个单一的上下文变量,flatpage,这是平面对象。它在呈现模板时使用RequestContext

如果结果网址引用有效的平面网页,则中间件将仅添加尾部斜杠和重定向(通过查看APPEND_SLASH设置)。重定向是永久的(301状态码)。

如果它没有找到匹配,请求继续照常处理。

中间件仅针对404s激活 - 不是500秒或任何其他状态代码的响应。

Flatpages将不应用视图中间件

由于FlatpageFallbackMiddleware仅在网址解析失败并生成404后才应用,因此返回的响应将不应用任何view middleware方法。只有通过正常URL解析成功路由到视图的请求才应用视图中间件。

请注意,MIDDLEWARE_CLASSES的顺序很重要。通常,您可以将FlatpageFallbackMiddleware放在列表的结尾。这意味着它将在处理响应时首先运行,并确保任何其他响应处理中间件看到真实的平面响应,而不是404。

有关中间件的更多信息,请阅读middleware docs

确保您的404模板工作正常

请注意,FlatpageFallbackMiddleware只会在另一个视图成功生成404响应时执行。如果另一个视图或中间件类尝试生成404,但最终会引发异常,则响应将变为HTTP 500(“内部服务器错误”),并且FlatpageFallbackMiddleware将不会尝试提供平面页。

如何添加,更改和删除flatpages

通过管理界面

如果您已激活自动Django管理界面,您应该在管理索引页上看到一个“Flatpages”部分。在编辑系统中的任何其他对象时编辑平铺页。

通过Python API

class FlatPage[source]

平铺页由标准的Django model表示,它位于django / contrib / flatpages / models.py中。您可以通过Django database API访问平面对象。

检查重复的平面网址。

如果您通过自己的代码添加或修改广告页,则可能需要检查同一网站中的重复的平展页网址。管理员使用的平面表单执行此验证检查,并且可以从django.contrib.flatpages.forms.FlatPageForm导入并在您自己的视图中使用。

平板模板

默认情况下,通过模板flatpages/default.html呈现平铺页,但您可以覆盖特定平面页:在管理中,标题为“高级选项”的折叠字段集(单击将其展开)包含用于指定模板名称的字段。如果您通过Python API创建平面网页,则可以简单地将模板名称设置为FlatPage对象上的字段template_name

创建flatpages/default.html模板是您的责任;在模板目录中,只需创建一个包含文件default.htmlflatpages目录。

平板模板传递单个上下文变量,flatpage,这是平面对象。

以下是一个示例flatpages/default.html模板:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>{{ flatpage.title }}</title>
  5. </head>
  6. <body>
  7. {{ flatpage.content }}
  8. </body>
  9. </html>

由于您已将原始HTML输入到平面页面的管理页面,因此flatpage.titleflatpage.content都标记为而不是 automatic HTML escaping

获取列表FlatPage

flatpages应用提供了一个模板代码,可让您遍历current site上的所有可用平面网页。

Like all custom template tags, you’ll need to load its custom tag library before you can use it. 加载库后,您可以通过get_flatpages标记检索所有当前的平铺页:

  1. {% load flatpages %}
  2. {% get_flatpages as flatpages %}
  3. <ul>
  4. {% for page in flatpages %}
  5. <li><a href="{{ page.url }}">{{ page.title }}</a></li>
  6. {% endfor %}
  7. </ul>

显示registration_required

默认情况下,get_flatpages模板标签只会显示标记为registration_required = False t3 &gt;。如果要显示注册保护的纯页,则需要使用for子句指定已认证的用户。

例如:

  1. {% get_flatpages for someuser as about_pages %}

如果您提供匿名用户,则get_flatpages的行为将与您未提供用户的行为相同,即只显示公开的页面。

根据基本网址限制平面广告

可以应用可选参数starts_with,以将返回的页面限制为以特定基本URL开头的页面。此参数可以作为字符串传递,或作为要从上下文解析的变量传递。

例如:

  1. {% get_flatpages '/about/' as about_pages %}
  2. {% get_flatpages about_prefix as about_pages %}
  3. {% get_flatpages '/about/' for someuser as about_pages %}

整合django.contrib.sitemaps

class FlatPageSitemap[source]

sitemaps.FlatPageSitemap类查看为当前SITE_ID定义的所有公开可见的flatpages(请参阅sites documentation这些条目仅包含location属性 - 不是lastmodchangefreqpriority

Changed in Django 1.8:

此类可从旧版本的Django中的django.contrib.sitemaps.FlatPageSitemap获得。

示例

这里是一个使用FlatPageSitemap的URLconf示例:

  1. from django.conf.urls import url
  2. from django.contrib.flatpages.sitemaps import FlatPageSitemap
  3. from django.contrib.sitemaps.views import sitemap
  4. urlpatterns = [
  5. # ...
  6. # the sitemap
  7. url(r'^sitemap\.xml$', sitemap,
  8. {'sitemaps': {'flatpages': FlatPageSitemap}},
  9. name='django.contrib.sitemaps.views.sitemap'),
  10. ]