Flatpages-appenLink to this heading

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.

InstallationLink to this heading

Följ dessa steg för att installera Flatpages-appen:

  1. Installera sites-ramverket genom att lägga till 'django.contrib.sites' i din INSTALLED_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 vanligtvis 1 (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.

  2. Lägg till 'django.contrib.flatpages' till din INSTALLED_APPS inställning.

Då antingen..:

  1. Lägg till en post i din URLconf. Till exempel:

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

eller:

  1. Lägg till 'django.contrib.flatpages.middleware.FlatpageFallbackMiddleware' till din MIDDLEWARE inställning.

  2. Kör kommandot manage.py migrate.

Hur det fungerarLink to this heading

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 URLconfLink to this heading

There are several ways to include the flatpages in your URLconf. You can dedicate a particular path to flatpages:

Code
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:

Code
from django.contrib.flatpages import views

# Your other patterns here
urlpatterns += [
    re_path(r"^(?P<url>.*/)$", views.flatpage),
]

Another common setup is to use flatpages for a limited set of known pages and to hardcode their URLs in the URLconf:

Code
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 mellanprogramLink to this heading

Klassen:~django.contrib.flatpages.middleware.FlatpageFallbackMiddleware kan göra allt arbete.

class FlatpageFallbackMiddlewareLink to this definition

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änder RequestContext 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.

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.

Så här lägger du till, ändrar och tar bort flatpagesLink to this heading

Via administratörsgränssnittetLink to this heading

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:

Code
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 APILink to this heading

Flatpages representeras av en standard Django model, FlatPage. Du kan komma åt flatpage-objekt via Django database API.

FlatPage modellLink to this heading

class models.FlatPageLink to this definition

FältLink to this heading

FlatPage-objekt har följande fält:

class models.FlatPage
urlLink to this definition

Krävs. 100 tecken eller färre. Indexerad för snabbare sökningar.

titleLink to this definition

Krävs. 200 tecken eller färre.

contentLink to this definition

Valfritt (blank=True). TextField som vanligtvis innehåller HTML-innehållet på sidan.

enable_commentsLink to this definition

Boolesk. Detta fält används inte av flatpages som standard och visas inte i admin-gränssnittet. Se flatpages admin interface section för en detaljerad förklaring.

template_nameLink to this definition

Valfritt (blank=True). 70 tecken eller färre. Anger den mall som används för att rendera sidan. Standardvärdet är flatpages/default.html om den inte anges.

sitesLink to this definition

Många-till-många-relation till Site, som bestämmer sites som den platta sidan är tillgänglig på.

MetoderLink to this heading

class models.FlatPage
get_absolute_url()Link to this definition

Returnerar den relativa URL-sökvägen för sidan baserat på attributet url.

Mallar för platta sidorLink to this heading

By default, flatpages are rendered via the template flatpages/default.html, but you can override that for a particular flatpage: in the admin, a collapsed fieldset titled ”Advanced options” (clicking will expand it) contains a field for specifying a template name. If you’re creating a flatpage via the Python API you can set the template name as the field template_name on the FlatPage object.

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 flatpages/default.html mall:

Django template
<!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 mallarLink to this heading

Appen Flatpages tillhandahåller en malltagg som gör att du kan iterera över alla tillgängliga flatpages på aktuell webbplats.

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:

Django template
{% 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 flatpagesLink to this heading

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:

Django template
{% 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-URLLink to this heading

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:

Django template
{% 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.sitemapsLink to this heading

class FlatPageSitemapLink to this definition

Klassen sitemaps.FlatPageSitemap tittar på alla offentligt synliga flatpages som definieras för den aktuella SITE_ID (se sites-dokumentationen) och skapar en post i webbplatskartan. Dessa poster inkluderar endast attributet location – inte lastmod, changefreq eller priority.

ExempelLink to this heading

Här är ett exempel på en URLconf som använder FlatPageSitemap:

Code
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",
    ),
]