flatpages 应用¶
Django 带有一个可选的“flatpages”应用程序。它允许您将“静态”HTML 内容存储在数据库中,并通过 Django 的管理界面和 Python API 处理管理工作。
一个 flatpage 是一个包含 URL、标题和内容的对象。将其用于一次性、特殊情况的页面,例如“关于”或“隐私政策”页面,您希望将其存储在数据库中,但又不想为此开发自定义 Django 应用程序。
一个 flatpage 可以使用自定义模板或默认的系统范围的 flatpage 模板。它可以与一个或多个站点关联。
如果您希望将内容放在自定义模板中,则可以可选地将内容字段留空。
安装¶
要安装 flatpages 应用,请按照以下步骤操作
安装
sites framework
,方法是将'django.contrib.sites'
添加到您的INSTALLED_APPS
设置中(如果尚未添加)。还要确保您已正确设置
SITE_ID
,使其与设置文件所代表的站点的 ID 相对应。这通常为1
(即SITE_ID = 1
),但如果您使用 sites 框架管理多个站点,则它可能是不同站点的 ID。将
'django.contrib.flatpages'
添加到您的INSTALLED_APPS
设置中。
然后执行以下任一操作:
在您的 URLconf 中添加一个条目。例如
urlpatterns = [ path("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
将 flatpage 与站点关联。
使用 URLconf¶
有几种方法可以将 flat pages 包含在您的 URLconf 中。您可以将特定路径专门用于 flat pages
urlpatterns = [
path("pages/", include("django.contrib.flatpages.urls")),
]
您还可以将其设置为“通配符”模式。在这种情况下,将其模式放在其他 urlpatterns 的末尾非常重要
from django.contrib.flatpages import views
# Your other patterns here
urlpatterns += [
re_path(r"^(?P<url>.*/)$", views.flatpage),
]
警告
如果您将APPEND_SLASH
设置为False
,则必须删除通配符模式中的斜杠,否则不带尾部斜杠的 flatpages 将无法匹配。
另一种常见的设置是将 flat pages 用于一组有限的已知页面并硬编码 URL,以便您可以使用url
模板标签引用它们
from django.contrib.flatpages import views
urlpatterns += [
path("about-us/", views.flatpage, {"url": "/about-us/"}, name="about"),
path("license/", views.flatpage, {"url": "/license/"}, name="license"),
]
使用中间件¶
FlatpageFallbackMiddleware
可以完成所有工作。
- class FlatpageFallbackMiddleware[source]¶
每次任何 Django 应用程序引发 404 错误时,此中间件都会作为最后手段检查 flatpages 数据库中是否存在请求的 URL。具体来说,它会检查是否存在具有给定 URL 和与
SITE_ID
设置相对应的站点 ID 的 flatpage。如果找到匹配项,它将遵循以下算法:
如果 flatpage 具有自定义模板,则加载该模板。否则,加载模板
flatpages/default.html
。它将一个上下文变量
flatpage
传递给该模板,该变量是 flatpage 对象。它在渲染模板时使用RequestContext
。
仅当生成的 URL 指向有效的 flatpage 时,中间件才会添加尾部斜杠并重定向(通过查看
APPEND_SLASH
设置)。重定向为永久性重定向(301 状态代码)。如果未找到匹配项,则请求将照常继续处理。
中间件仅在 404 错误时激活,而不是在 500 错误或任何其他状态代码的响应时激活。
Flatpages 不会应用视图中间件
由于FlatpageFallbackMiddleware
仅在 URL 解析失败并产生 404 后才应用,因此它返回的响应不会应用任何视图中间件方法。只有通过正常的 URL 解析成功路由到视图的请求才会应用视图中间件。
请注意MIDDLEWARE
的顺序很重要。通常,您可以将FlatpageFallbackMiddleware
放在列表的末尾。这意味着它将在处理响应时首先运行,并确保任何其他响应处理中间件都能看到真实的 flatpage 响应,而不是 404 响应。
有关中间件的更多信息,请阅读中间件文档。
确保您的 404 模板正常工作
请注意,FlatpageFallbackMiddleware
仅在另一个视图成功生成 404 响应后才会介入。如果另一个视图或中间件类尝试生成 404 但最终引发异常,则响应将变为 HTTP 500(“内部服务器错误”),并且FlatpageFallbackMiddleware
不会尝试提供 flat page。
如何添加、更改和删除 flatpages¶
警告
应将添加或编辑 flatpages 的权限限制为可信用户。Flatpages 由原始 HTML 定义,并且不会由 Django 进行清理。因此,恶意 flatpage 可能导致各种安全漏洞,包括权限提升。
通过管理界面¶
如果您启用了自动 Django 管理界面,则应该在管理索引页面上看到“Flatpages”部分。像编辑系统中的任何其他对象一样编辑 flatpages。
FlatPage
模型有一个enable_comments
字段,该字段未使用contrib.flatpages
,但可能对您的项目或第三方应用程序有用。它不会显示在管理界面中,但您可以通过为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 gettext_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)
通过 Python API¶
- class FlatPage[source]¶
Flatpages 由标准Django 模型表示,该模型位于django/contrib/flatpages/models.py中。您可以通过Django 数据库 API访问 flatpage 对象。
检查重复的 flatpage URL。
如果您通过自己的代码添加或修改 flatpages,则可能需要检查同一站点中是否存在重复的 flatpage URL。管理界面中使用的 flatpage 表单会执行此验证检查,并且可以从django.contrib.flatpages.forms.FlatpageForm
导入并在您自己的视图中使用。
Flatpage 模板¶
默认情况下,flatpages 通过模板flatpages/default.html
呈现,但您可以为特定 flatpage 覆盖它:在管理界面中,“高级选项”标题的折叠字段集(单击将展开它)包含一个用于指定模板名称的字段。如果您通过 Python API 创建 flat page,则可以将模板名称设置为FlatPage
对象上的template_name
字段。
创建flatpages/default.html
模板是您的责任;在您的模板目录中,创建一个名为flatpages
的目录,其中包含一个名为default.html
的文件。
Flatpage 模板传递一个上下文变量 flatpage
,它表示 flatpage 对象。
这是一个 flatpages/default.html
模板示例
<!DOCTYPE html>
<html lang="en">
<head>
<title>{{ flatpage.title }}</title>
</head>
<body>
{{ flatpage.content }}
</body>
</html>
由于您已经在 flatpage 的管理页面中输入了原始 HTML,因此 flatpage.title
和 flatpage.content
都被标记为**无需**在模板中进行自动 HTML 转义。
在模板中获取 FlatPage
对象列表¶
flatpages 应用提供了一个模板标签,允许您迭代当前站点上所有可用的 flatpages。
与所有自定义模板标签一样,您需要加载其自定义标签库才能使用它。加载库后,您可以通过get_flatpages
标签检索所有当前的 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
的 flatpages。如果您想显示受注册保护的 flatpages,则需要使用 for
子句指定经过身份验证的用户。
例如
{% get_flatpages for someuser as about_pages %}
如果您提供匿名用户,get_flatpages
的行为将与您未提供用户时相同,即它只会显示公共 flatpages。
按基本 URL 限制 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[source]¶
sitemaps.FlatPageSitemap
类查看当前SITE_ID
(请参阅sites 文档
)定义的所有公开可见的flatpages
,并在站点地图中创建条目。这些条目仅包含location
属性,不包含lastmod
、changefreq
或priority
。
示例¶
这是一个使用FlatPageSitemap
的 URLconf 示例
from django.contrib.flatpages.sitemaps import FlatPageSitemap
from django.contrib.sitemaps.views import sitemap
from django.urls import path
urlpatterns = [
# ...
# the sitemap
path(
"sitemap.xml",
sitemap,
{"sitemaps": {"flatpages": FlatPageSitemap}},
name="django.contrib.sitemaps.views.sitemap",
),
]