flatpages 应用

Django 带有一个可选的“flatpages”应用程序。它允许您将“静态”HTML 内容存储在数据库中,并通过 Django 的管理界面和 Python API 处理管理工作。

一个 flatpage 是一个包含 URL、标题和内容的对象。将其用于一次性、特殊情况的页面,例如“关于”或“隐私政策”页面,您希望将其存储在数据库中,但又不想为此开发自定义 Django 应用程序。

一个 flatpage 可以使用自定义模板或默认的系统范围的 flatpage 模板。它可以与一个或多个站点关联。

如果您希望将内容放在自定义模板中,则可以可选地将内容字段留空。

安装

要安装 flatpages 应用,请按照以下步骤操作

  1. 安装sites framework,方法是将'django.contrib.sites'添加到您的INSTALLED_APPS设置中(如果尚未添加)。

    还要确保您已正确设置SITE_ID,使其与设置文件所代表的站点的 ID 相对应。这通常为1(即SITE_ID = 1),但如果您使用 sites 框架管理多个站点,则它可能是不同站点的 ID。

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

然后执行以下任一操作:

  1. 在您的 URLconf 中添加一个条目。例如

    urlpatterns = [
        path("pages/", include("django.contrib.flatpages.urls")),
    ]
    

  1. 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'添加到您的MIDDLEWARE设置中。

  2. 运行命令manage.py migrate

工作原理

manage.py migrate在您的数据库中创建两个表:django_flatpagedjango_flatpage_sitesdjango_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.titleflatpage.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 属性,不包含lastmodchangefreqpriority

示例

这是一个使用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",
    ),
]
返回顶部