Hur man åsidosätter mallar¶
I ditt projekt kanske du vill åsidosätta en mall i en annan Django-applikation, oavsett om det är en tredjepartsapplikation eller en contrib-applikation som django.contrib.admin. Du kan antingen lägga mallöverskrivningar i ditt projekts mallkatalog eller i en applikations mallkatalog.
Om du har app- och projektmallskataloger som båda innehåller åsidosättningar, kommer Djangos standardmallsladdare att försöka ladda mallen från projektnivåkatalogen först. Med andra ord söks DIRS före APP_DIRS.
Se även
Läs Åsidosätta inbyggda widgetmallar om du vill göra det.
Åsidosättande från projektets mallkatalog¶
Först ska vi utforska hur du kan åsidosätta mallar genom att skapa ersättningsmallar i projektets mallkatalog.
Låt oss säga att du försöker åsidosätta mallarna för en tredjepartsapplikation som heter blog, som tillhandahåller mallarna blog/post.html och blog/list.html. De relevanta inställningarna för ditt projekt skulle se ut så här:
from pathlib import Path
BASE_DIR = Path(__file__).resolve().parent.parent
INSTALLED_APPS = [
...,
"blog",
...,
]
TEMPLATES = [
{
"BACKEND": "django.template.backends.django.DjangoTemplates",
"DIRS": [BASE_DIR / "templates"],
"APP_DIRS": True,
# ...
},
]
Inställningen TEMPLATES och BASE_DIR finns redan om du skapade ditt projekt med hjälp av standardmallen för projektet. Den inställning som behöver ändras är DIRS.
Dessa inställningar förutsätter att du har en templates-katalog i roten av ditt projekt. Om du vill åsidosätta mallarna för appen blog skapar du en mapp i katalogen templates och lägger till mallfilerna i den mappen:
templates/
blog/
list.html
post.html
Mallladdaren letar först efter mallar i katalogen DIRS. När vyerna i appen blog frågar efter mallarna blog/post.html och blog/list.html kommer laddaren att returnera de filer som du just har skapat.
Åsidosätta från en apps mallkatalog¶
Eftersom du åsidosätter mallar som ligger utanför en av projektets appar är det vanligare att använda den första metoden och lägga mallöverskrivningarna i projektets mallmapp. Om du föredrar det är det dock också möjligt att lägga överskrivningarna i en apps mallkatalog.
Kontrollera först att dina mallinställningar kontrollerar inuti appkataloger:
TEMPLATES = [
{
# ...
"APP_DIRS": True,
# ...
},
]
Om du vill lägga mallöverskrivningarna i en app som heter myapp och mallarna som ska överskrivas heter blog/list.html och blog/post.html, kommer din katalogstruktur att se ut som följer:
myapp/
templates/
blog/
list.html
post.html
Om APP_DIRS är inställd på True kommer mallladdaren att leta i appens mallkatalog och hitta mallarna.
Utöka en åsidosatt mall¶
Med dina mallladdare konfigurerade kan du utöka en mall med hjälp av {% extends %} malltaggen samtidigt som du åsidosätter den. Detta kan göra att du kan göra små anpassningar utan att behöva implementera hela mallen på nytt.
Du kan till exempel använda den här tekniken för att lägga till en egen logotyp i mallen admin/base_site.html:
templates/admin/base_site.html¶ {% extends "admin/base_site.html" %}
{% block branding %}
<img src="link/to/logo.png" alt="logo">
{{ block.super }}
{% endblock %}
Viktiga punkter att notera:
I exemplet skapas en fil i
templates/admin/base_site.htmlsom använder den konfigurerade katalogentemplatespå projektnivå för att åsidosättaadmin/base_site.html.Den nya mallen utökar
admin/base_site.html, som är samma mall som åsidosätts.Mallen ersätter bara blocket
branding, lägger till en egen logotyp och använderblock.superför att behålla det tidigare innehållet.Resten av mallen ärvs oförändrad från
admin/base_site.html.
Den här tekniken fungerar eftersom malladdaren inte tar hänsyn till den redan laddade override-mallen (på templates/admin/base_site.html) när den löser extends-taggen. Kombinerat med block.super är det en kraftfull teknik för att göra små anpassningar.