flatpages应用程序¶
Django提供了一个可选的“flatpages”应用程序。它允许您在数据库中存储简单的“平面”HTML内容,并通过Django的管理界面和Python API处理您的管理。
flatpage是一个带有URL,标题和内容的简单对象。将其用于一次性特殊情况页面(例如“关于”或“隐私策略”页面),您希望将其存储在数据库中,但不想开发自定义Django应用程序。
平面页面可以使用自定义模板或默认的系统级平面模板。它可以与一个或多个网站相关联。
如果您希望将内容放在自定义模板中,则可以将内容字段留空。
以下是Django支持的网站上的平面网页示例:
安装¶
要安装flatpages应用,请按照下列步骤操作:
通过将
'django.contrib.sites'
添加到您的INSTALLED_APPS
设置来安装sites framework
,如果它还不在那里。还要确保您已正确设置
SITE_ID
为设置文件所代表的网站的ID。这通常是1
(即SITE_ID = 1
,但如果您使用网站框架来管理多个网站,则可能是不同网站的ID。将
'django.contrib.flatpages'
添加到您的INSTALLED_APPS
设置。
然后:
在URLconf中添加条目。例如:
urlpatterns = [ url(r'^pages/', include('django.contrib.flatpages.urls')), ]
要么:
将
'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'
添加到您的MIDDLEWARE
设置。运行命令
manage.py migrate
。
怎么运行的¶
manage.py migrate
在您的数据库中创建两个表:django_flatpage
和 django_flatpage_sites
。 django_flatpage
是一个简单的查找表,只是将URL映射到一个标题和一堆文本内容。 django_flatpage_sites
将平面页面与网站相关联。
使用URLconf¶
有多种方法可以在您的URLconf中包含平面网页。您可以将特定路径专用于平面页面:
urlpatterns = [
url(r'^pages/', include('django.contrib.flatpages.urls')),
]
您还可以将其设置为“总线”模式。在这种情况下,重要的是将图案放置在其他网格模式的末端:
from django.contrib.flatpages import views
# Your other patterns here
urlpatterns += [
url(r'^(?P<url>.*/)$', views.flatpage),
]
警告
如果将 APPEND_SLASH
设置为 False
,则必须删除总线模式中的斜杠,否则不会匹配尾部斜杠。
另一个常见的设置是将平面页面用于一组有限的已知页面,并对URL进行硬编码,因此您可以使用 url
模板标签:
from django.contrib.flatpages import views
urlpatterns += [
url(r'^about-us/$', views.flatpage, {'url': '/about-us/'}, name='about'),
url(r'^license/$', views.flatpage, {'url': '/license/'}, name='license'),
]
使用中间件¶
FlatpageFallbackMiddleware
可以做所有的工作。
-
class
FlatpageFallbackMiddleware
¶ 每次任何Django应用程序引发404错误,此中间件会检查flatpages数据库中所请求的URL作为最后手段。具体来说,它检查具有对应于
SITE_ID
设置的站点ID的给定URL的平面页面。如果找到匹配,它遵循此算法:
如果flatpage有一个自定义模板,它将加载该模板。否则,它加载模板
flatpages/default.html
。它传递那个模板一个单一的上下文变量,
flatpage
,它是flatpage对象。它在渲染模板中使用RequestContext
。
中间件将仅添加尾部斜杠和重定向(通过查看
APPEND_SLASH
设置),如果生成的URL引用有效的平面页面。重定向是永久的(301状态代码)。如果它没有找到匹配,请求继续照常处理。
中间件只会被激活为404s - 不是500s或任何其他状态代码的响应。
Flatpages不会应用视图中间件
因为 FlatpageFallbackMiddleware
仅在URL解析失败并生成404后才应用,所返回的响应将不会应用任何 视图中间件 方法。只有通过正常URL解析成功路由到视图的请求才应用视图中间件。
注意 MIDDLEWARE
的顺序很重要。一般来说,你可以把 FlatpageFallbackMiddleware
放在列表的结尾。这意味着它将在处理响应时首先运行,并确保任何其他响应处理中间件看到真实的平面响应,而不是404。
有关中间件的更多信息,请阅读 中间件文档。
确保您的404模板工作正常
请注意,FlatpageFallbackMiddleware
只有在另一个视图成功生成404响应后才会执行。如果另一个视图或中间件类试图产生一个404,但最终会引发一个异常,响应将变成HTTP 500(“内部服务器错误”),FlatpageFallbackMiddleware
不会尝试提供一个平面页面。
如何添加,更改和删除flatpages¶
通过管理界面¶
如果您已激活自动Django管理界面,则应在管理索引页上看到“Flatpages”部分。在编辑系统中的任何其他对象时编辑平铺页。
FlatPage
模型具有 contrib.flatpages
未使用的 enable_comments
字段,但这可能对您的项目或第三方应用程序有用。它不显示在管理界面中,但您可以通过注册 FlatPage
的自定义 ModelAdmin
来添加它:
from django.contrib import admin
from django.contrib.flatpages.admin import FlatPageAdmin
from django.contrib.flatpages.models import FlatPage
from django.utils.translation import ugettext_lazy as _
# Define a new FlatPageAdmin
class FlatPageAdmin(FlatPageAdmin):
fieldsets = (
(None, {'fields': ('url', 'title', 'content', 'sites')}),
(_('Advanced options'), {
'classes': ('collapse', ),
'fields': (
'enable_comments',
'registration_required',
'template_name',
),
}),
)
# Re-register FlatPageAdmin
admin.site.unregister(FlatPage)
admin.site.register(FlatPage, FlatPageAdmin)
enable_comments
字段从 FlatPageAdmin
中删除。
通过Python API¶
-
class
FlatPage
¶ 平面页由标准 Django模型 表示,其存在于 django/contrib/flatpages/models.py 中。您可以通过 Django数据库API 访问平面对象。
检查重复的平面网址。
如果您通过自己的代码添加或修改广告页,则可能需要检查同一网站中的重复的平展页网址。在admin中使用的平面表单执行此验证检查,并且可以从 django.contrib.flatpages.forms.FlatpageForm
导入并在您自己的视图中使用。
平板模板¶
默认情况下,通过模板 flatpages/default.html
呈现平铺页,但是您可以覆盖特定平面页:在管理中,标题为“高级选项”(单击将展开它)的折叠字段集包含用于指定模板名称的字段。如果您通过Python API创建平面页面,您可以简单地将模板名称设置为 FlatPage
对象上的字段 template_name
。
创建 flatpages/default.html
模板是您的责任;在您的模板目录中,只需创建一个包含文件 default.html
的 flatpages
目录。
Flatpage模板传递单个上下文变量 flatpage
,它是flatpage对象。
这里有一个示例 flatpages/default.html
模板:
<!DOCTYPE html>
<html>
<head>
<title>{{ flatpage.title }}</title>
</head>
<body>
{{ flatpage.content }}
</body>
</html>
由于您已将原始HTML输入到平面页面的管理页面,因此 flatpage.title
和 flatpage.content
都会在模板中标记为需要 自动HTML转义 的 不。
在模板中获取 FlatPage
对象的列表¶
flatpages应用提供了一个模板标签,允许您遍历 当前站点 上的所有可用平面页。
与所有自定义模板代码一样,您需要使用 加载其自定义标记库 才能使用它。加载库后,您可以通过 get_flatpages
标签检索所有当前的平铺页:
{% load flatpages %}
{% get_flatpages as flatpages %}
<ul>
{% for page in flatpages %}
<li><a href="{{ page.url }}">{{ page.title }}</a></li>
{% endfor %}
</ul>
显示 registration_required
flatpages¶
默认情况下,get_flatpages
模板标记只会显示标记为 registration_required = False
的平铺页。如果要显示注册保护的纯页,则需要使用 for
子句指定已认证的用户。
例如:
{% get_flatpages for someuser as about_pages %}
如果您提供匿名用户,则 get_flatpages
的行为将与您未提供用户相同,即它只会显示您的公开的页面。
根据基本网址限制平面广告¶
可以应用可选参数 starts_with
来将返回的页面限制为以特定基本URL开头的页面。此参数可以作为字符串传递,或作为要从上下文解析的变量传递。
例如:
{% get_flatpages '/about/' as about_pages %}
{% get_flatpages about_prefix as about_pages %}
{% get_flatpages '/about/' for someuser as about_pages %}
与 django.contrib.sitemaps
集成¶
-
class
FlatPageSitemap
[源代码]¶ sitemaps.FlatPageSitemap
类查看为当前SITE_ID
定义的所有公开可见的flatpages
(参见sites documentation
),并在站点地图中创建一个条目。这些条目仅包括location
属性 - 不包括lastmod
,changefreq
或priority
。
例¶
下面是使用 FlatPageSitemap
的URLconf的示例:
from django.conf.urls import url
from django.contrib.flatpages.sitemaps import FlatPageSitemap
from django.contrib.sitemaps.views import sitemap
urlpatterns = [
# ...
# the sitemap
url(r'^sitemap\.xml$', sitemap,
{'sitemaps': {'flatpages': FlatPageSitemap}},
name='django.contrib.sitemaps.views.sitemap'),
]