flatpages app

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

flatpage是一个带有URL,标题和内容的简单对象。 将其用于您要存储在数据库中但不想开发自定义Django应用程序的一次性,特殊页面,如“关于”或“隐私策略”页面。

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

如果您希望将内容放入自定义模板中,内容字段可以选择保留空白。

以下是Django支持的站点的一些平台页面示例:

安装¶ T0>

要安装flatpages应用程序,请按照下列步骤操作:

  1. 通过将'django.contrib.sites'添加到INSTALLED_APPS来安装sites framework >设置,如果它不在那里。

    另外,请确保您已正确设置SITE_ID为设置文件所代表的网站的ID。 这通常是1(即SITE_ID = 重新使用网站框架来管理多个网站,它可能是一个不同的网站的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 creates two tables in your database: django_flatpage and django_flatpage_sites. django_flatpage is a simple lookup table that simply maps a URL to a title and bunch of text content. django_flatpage_sites associates a flatpage with a site.

使用URLconf

有几种方法可以将平面页面包含在你的URLconf中。 您可以将特定的路径奉献给平面页面:

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

您也可以将其设置为“catchall”模式。 在这种情况下,将模式放在其他urlpatterns的结尾是非常重要的:

from django.contrib.flatpages import views

# Your other patterns here
urlpatterns += [
    path('<path:url>', views.flatpage),
]

警告

如果您将APPEND_SLASH设置为False,则必须删除全部格式中的斜线,否则将不匹配斜线。

另一个常见的设置是对一组有限的已知页面使用平面页面,并对网址进行硬编码,以便使用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可以完成所有的工作。

FlatpageFallbackMiddleware T0> ¶ T1>

每当Django应用程序出现404错误时,这个中间件都会检查所请求的URL的flatpages数据库,作为最后的手段。 具体来说,它会检查具有给定网址的flatpage,网址ID对应于SITE_ID设置。

如果发现匹配,则遵循以下算法:

  • 如果flatpage具有自定义模板,则会加载该模板。 否则,它会加载模板flatpages/default.html
  • It passes that template a single context variable, flatpage, which is the flatpage object. 它在呈现模板时使用RequestContext

如果生成的URL引用了有效的flatpage,中间件将只添加尾随斜杠和重定向(通过查看APPEND_SLASH设置)。 重定向是永久的(301状态码)。

如果找不到匹配,则继续像往常一样处理该请求。

中间件只能被激活404s - 不是500s或任何其他状态码的响应。

分页不会应用查看中间件

由于FlatpageFallbackMiddleware仅在URL解析失败并生成了404之后应用,所以它返回的响应将不会应用任何view middleware方法。 只有通过普通URL解析成功路由到视图的请求才能应用视图中间件。

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

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

确保你的404模板有效

请注意,FlatpageFallbackMiddleware只有在另一个视图成功生成了404响应后才能进入。 如果另一个视图或中间件类试图产生一个404,但是最终会引发一个异常,那么响应将成为一个HTTP 500(“内部服务器错误”),并且FlatpageFallbackMiddleware不会尝试服务于一个单位页。

如何添加,更改和删除页面

通过管理界面

如果您已经激活自动Django管理界面,您应该在管理索引页面上看到一个“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

简单页面 T0> ¶ T1>

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

检查重复的页面网址。

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

平面模板

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

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

Flatpage templates are passed a single context variable, flatpage, which is the flatpage object.

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

<!DOCTYPE html>
<html>
<head>
<title>{{ flatpage.title }}</title>
</head>
<body>
{{ flatpage.content }}
</body>
</html>

由于您已经将原始HTML输入到flatpage的管理页面,因此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标签检索所有当前的页面:

{% load flatpages %}
{% get_flatpages as flatpages %}
<ul>
    {% for page in flatpages %}
        <li><a href="{{ page.url }}">{{ page.title }}</a></li>
    {% endfor %}
</ul>

显示registration_required页面

默认情况下,get_flatpages模板标签只会显示标记为registration_required = False t3 >。 如果要显示受注册保护的页面,则需要使用for子句指定已通过身份验证的用户。

例如:

{% get_flatpages for someuser as about_pages %}

如果您提供了匿名用户,那么get_flatpages的行为与未提供用户的行为相同,即只显示您的公共页面。

通过基本URL 限制平面页

可以使用可选参数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 集成¶

FlatPageSitemap[source]

sitemaps.FlatPageSitemap类查看为当前SITE_ID定义的所有公开可见的flatpages(请参见sites documentation),并在站点地图中创建一个条目。 这些条目只包含location属性 - 而不是lastmodchangefreqpriority

实施例¶ T0>

下面是一个使用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'),
]