Flatpages-appen¶
Django levereras med en valfri ”flatpages”-applikation. Den låter dig lagra ”platt” HTML-innehåll i en databas och hanterar hanteringen åt dig via Djangos admin-gränssnitt och ett Python API.
En flatpage är ett objekt med en URL, en titel och ett innehåll. Använd den för enstaka sidor i specialfall, t.ex. sidor med ”Om” eller ”Sekretesspolicy”, som du vill lagra i en databas men som du inte vill utveckla en anpassad Django-applikation för.
En flatpage kan använda en anpassad mall eller en standardmall för flatpage som gäller för hela systemet. Den kan vara kopplad till en eller flera webbplatser.
Innehållsfältet kan eventuellt lämnas tomt om du föredrar att lägga ditt innehåll i en anpassad mall.
Installation¶
Följ dessa steg för att installera Flatpages-appen:
Installera
sites-ramverket
genom att lägga till'django.contrib.sites'
i dinINSTALLED_APPS
-inställning, om det inte redan finns där.Kontrollera också att du har ställt in
SITE_ID
till ID:t för den webbplats som inställningsfilen representerar. Detta är vanligtvis1
(dvs.SITE_ID = 1
), men om du använder sites-ramverket för att hantera flera webbplatser kan det vara ID:t för en annan webbplats.Lägg till
'django.contrib.flatpages'
till dinINSTALLED_APPS
inställning.
Då antingen..:
Lägg till en post i din URLconf. Till exempel:
urlpatterns = [ path("pages/", include("django.contrib.flatpages.urls")), ]
eller:
Lägg till
'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware'
till dinMIDDLEWARE
inställning.Kör kommandot
manage.py migrate
.
Hur det fungerar¶
manage.py migrate
skapar två tabeller i din databas: django_flatpage
och django_flatpage_sites
. django_flatpage
är en uppslagstabell som mappar en URL till en titel och en massa textinnehåll. django_flatpage_sites
associerar en flatpage med en webbplats.
Använda URLconf¶
Det finns flera sätt att inkludera de platta sidorna i din URLconf. Du kan ägna en särskild sökväg åt platta sidor:
urlpatterns = [
path("pages/", include("django.contrib.flatpages.urls")),
]
Du kan också använda det som ett ”catchall”-mönster. I det här fallet är det viktigt att placera mönstret i slutet av de andra urlmönstren:
from django.contrib.flatpages import views
# Your other patterns here
urlpatterns += [
re_path(r"^(?P<url>.*/)$", views.flatpage),
]
Varning
Om du ställer in APPEND_SLASH
till False
måste du ta bort snedstrecket i catchall-mönstret, annars matchas inte sidor utan ett efterföljande snedstreck.
En annan vanlig inställning är att använda platta sidor för en begränsad uppsättning kända sidor och att hårdkoda deras webbadresser i URLconf:
from django.contrib.flatpages import views
urlpatterns += [
path("about-us/", views.flatpage, kwargs={"url": "/about-us/"}, name="about"),
path("license/", views.flatpage, kwargs={"url": "/license/"}, name="license"),
]
Argumentet kwargs
anger det url
-värde som används för modelluppslagningen FlatPage
i flatpage-vyn.
Argumentet name
gör att URL:en kan vändas i mallar, t.ex. med hjälp av malltaggen url
.
Använda mellanprogram¶
Klassen:~django.contrib.flatpages.middleware.FlatpageFallbackMiddleware kan göra allt arbete.
- class FlatpageFallbackMiddleware[source]¶
Varje gång en Django-applikation ger upphov till ett 404-fel kontrollerar detta middleware flatpages-databasen för den begärda webbadressen som en sista utväg. Specifikt kontrolleras om det finns en flatpage med den angivna URL:en med ett webbplats-ID som motsvarar inställningen
SITE_ID
.Om den hittar en matchning följer den den här algoritmen:
Om sidan har en egen mall laddas den mallen. Annars laddas mallen
flatpages/default.html
.Den skickar den mallen en enda kontextvariabel,
flatpage
, som är flatpage-objektet. Den använderRequestContext
vid rendering av mallen.
Mellanvaran lägger bara till ett efterföljande snedstreck och omdirigerar (genom att titta på inställningen
APPEND_SLASH
) om den resulterande URL:en hänvisar till en giltig flatpage. Omdirigeringar är permanenta (301 statuskod).Om den inte hittar någon matchning fortsätter begäran att behandlas som vanligt.
Middleware aktiveras endast för 404:or - inte för 500:or eller svar med någon annan statuskod.
Flatpages kommer inte att tillämpa view middleware
Eftersom FlatpageFallbackMiddleware
tillämpas först efter att URL-upplösningen har misslyckats och resulterat i en 404, kommer det svar som returneras inte att tillämpa några :ref:view middleware <view-middleware>
metoder. Endast förfrågningar som framgångsrikt dirigeras till en vy via normal URL-upplösning tillämpar view middleware.
Observera att ordningen på MIDDLEWARE
spelar roll. I allmänhet kan du sätta FlatpageFallbackMiddleware
i slutet av listan. Detta innebär att det kommer att köras först när svaret bearbetas och säkerställer att alla andra svarsbearbetande mellanprogram ser det riktiga flatpage-svaret snarare än 404.
Mer information om middleware finns i middleware docs.
Se till att din 404-mall fungerar
Observera att FlatpageFallbackMiddleware
endast träder in när en annan vy framgångsrikt har producerat ett 404-svar. Om en annan vy eller middleware-klass försöker producera ett 404-svar men istället skapar ett undantag, kommer svaret att bli ett HTTP 500 (”Internal Server Error”) och FlatpageFallbackMiddleware
kommer inte att försöka servera en flat sida.
Så här lägger du till, ändrar och tar bort flatpages¶
Varning
Behörighet att lägga till eller redigera flatpages bör begränsas till betrodda användare. Flatpages definieras av rå HTML och är inte sanerade av Django. Som en följd av detta kan en skadlig flatpage leda till olika säkerhetsproblem, inklusive behörighetseskalering.
Via administratörsgränssnittet¶
Om du har aktiverat det automatiska Django-administratörsgränssnittet bör du se ett ”Flatpages”-avsnitt på adminindexsidan. Redigera flatpages som du redigerar alla andra objekt i systemet.
Modellen FlatPage
har ett fält enable_comments
som inte används av contrib.flatpages
, men som kan vara användbart för ditt projekt eller tredjepartsappar. Det visas inte i admin-gränssnittet, men du kan lägga till det genom att registrera en anpassad ModelAdmin
för FlatPage
:
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)
Via Python API¶
Flatpages representeras av en standard Django model, FlatPage
. Du kan komma åt flatpage-objekt via Django database API.
Kontrollera om det finns dubbletter av URL:er för flatpage.
Om du lägger till eller ändrar flatpages via din egen kod kommer du sannolikt att vilja kontrollera om det finns dubbla URL:er för flatpages på samma webbplats. Flatpage-formuläret som används i admin utför denna valideringskontroll och kan importeras från django.contrib.flatpages.forms.FlatpageForm
och användas i dina egna vyer.
FlatPage
modell¶
- class models.FlatPage¶
Fält¶
FlatPage
-objekt har följande fält:
- class models.FlatPage
- url¶
Krävs. 100 tecken eller färre. Indexerad för snabbare sökningar.
- title¶
Krävs. 200 tecken eller färre.
- content¶
Valfritt (
blank=True
).TextField
som vanligtvis innehåller HTML-innehållet på sidan.
- enable_comments¶
Boolesk. Detta fält används inte av
flatpages
som standard och visas inte i admin-gränssnittet. Se :ref:``flatpages admin interface section <flatpages-admin>` för en detaljerad förklaring.
- template_name¶
Valfritt (
blank=True
). 70 tecken eller färre. Anger den mall som används för att rendera sidan. Standardvärdet ärflatpages/default.html
om den inte anges.
Metoder¶
Mallar för platta sidor¶
Som standard återges flatpages via mallen flatpages/default.html
, men du kan åsidosätta detta för en viss flatpage: i admin finns ett kollapsat fält med titeln ”Advanced options” (klicka på det för att expandera det) som innehåller ett fält för att ange ett mallnamn. Om du skapar en platt sida via Python API kan du ange mallnamnet som fältet template_name
på objektet FlatPage
.
Det är ditt ansvar att skapa mallen flatpages/default.html
; i din mallkatalog skapar du en katalog flatpages
som innehåller filen default.html
.
Flatpage-mallar får en enda kontextvariabel, flatpage
, som är flatpage-objektet.
Här är ett exempel på en :fil:`flatpages/default.html` mall:
<!DOCTYPE html>
<html lang="en">
<head>
<title>{{ flatpage.title }}</title>
</head>
<body>
{{ flatpage.content }}
</body>
</html>
Eftersom du redan skriver in rå HTML på adminsidan för en flatpage, markeras både flatpage.title
och flatpage.content
som inte krävande automatisk HTML-escaping i mallen.
Få en lista över FlatPage
-objekt i dina mallar¶
Appen Flatpages tillhandahåller en malltagg som gör att du kan iterera över alla tillgängliga flatpages på :ref:aktuell webbplats <hooking-into-current-site-from-views>
.
Som alla anpassade malltaggar måste du ladda dess anpassade taggbibliotek innan du kan använda den. När du har laddat biblioteket kan du hämta alla aktuella flatpages via taggen get_flatpages
:
{% load flatpages %}
{% get_flatpages as flatpages %}
<ul>
{% for page in flatpages %}
<li><a href="{{ page.url }}">{{ page.title }}</a></li>
{% endfor %}
</ul>
Visning av registration_required
flatpages¶
Som standard visar malltaggen get_flatpages
endast flatpages som är markerade med registration_required = False
. Om du vill visa registreringsskyddade flatpages måste du ange en autentiserad användare med hjälp av en for
-klausul.
Till exempel:
{% get_flatpages for someuser as about_pages %}
Om du anger en anonym användare kommer get_flatpages
att bete sig på samma sätt som om du inte hade angett någon användare - dvs. den kommer bara att visa dig offentliga flatpages.
Begränsa flatpages genom bas-URL¶
Ett valfritt argument, starts_with
, kan användas för att begränsa de returnerade sidorna till dem som börjar med en viss bas-URL. Detta argument kan skickas som en sträng eller som en variabel som ska lösas upp från kontexten.
Till exempel:
{% get_flatpages '/about/' as about_pages %}
{% get_flatpages about_prefix as about_pages %}
{% get_flatpages '/about/' for someuser as about_pages %}
Integrering med django.contrib.sitemaps
¶
- class FlatPageSitemap[source]¶
Klassen
sitemaps.FlatPageSitemap
tittar på alla offentligt synligaflatpages
som definieras för den aktuellaSITE_ID
(sesites-dokumentationen
) och skapar en post i webbplatskartan. Dessa poster inkluderar endast attributetlocation
– intelastmod
,changefreq
ellerpriority
.
Exempel¶
Här är ett exempel på en URLconf som använder FlatPageSitemap
:
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",
),
]