Django-Templates

Djangos Template-System (Template System) ist eine Kernkomponente, die verwendet wird, um Geschäftslogik (Python) von der Präsentationsschicht (HTML) zu trennen. Es ermöglicht Entwicklern, HTML-Seiten dynamisch durch einfache Tags und Variablen zu generieren.

Im vorherigen Kapitel haben wirdjango.http.HttpResponse()verwendet, um"Hello World!"auszugeben. Dieser Ansatz vermischt Daten und Views miteinander, was nicht mit Djangos MVT-Philosophie übereinstimmt.

In diesem Abschnitt stellen wir die Anwendung von Django-Templates im Detail vor. Ein Template ist ein Text, der verwendet wird, um die Präsentationsform und den Inhalt eines Dokuments zu trennen.

FunktionenSyntax/BeispieleAnwendbare Szenarien
Variablen-Rendering{{ variable }}Daten dynamisch anzeigen
Logiksteuerung{% if %}, {% for %}Bedingtes/Schleifen-Rendering
Template-Vererbung{% extends %}, {% block %}Doppelte HTML-Strukturen vermeiden
Statische Dateien{% static 'path' %}CSS/JS/Bilder laden
Benutzerdefinierte Filter@register.filterTemplate-Funktionalität erweitern

Template-Anwendungsbeispiele

Ausgehend vom Projekt aus dem vorherigen Kapitel erstellen wir ein Verzeichnis templates unter dem Verzeichnis HelloWorld und legen eine Datei example.html an. Die gesamte Verzeichnisstruktur sieht wie folgt aus:

HelloWorld/
|-- HelloWorld
|   |-- __init__.py
|   |-- __init__.pyc
|   |-- settings.py
|   |-- settings.pyc
|   |-- urls.py
|   |-- urls.pyc
|   |-- views.py
|   |-- views.pyc
|   |-- wsgi.py
|   `-- wsgi.pyc
|-- manage.py
`-- templates
    `-- example.html

Der Code der Datei example.html sieht wie folgt aus:

Code der Datei HelloWorld/templates/example.html:

<h1>{{ hello }}</h1>

Von den Templates wissen wir, dass Variablen doppelte geschweifte Klammern verwenden.{{ }}。

Als Nächstes müssen wir Django den Template-Dateipfad mitteilen. Öffnen Sie die Datei HelloWorld/HelloWorld/settings.py und ändern SieTEMPLATESinDIRSist[BASE_DIR / "templates"], wie unten gezeigt:

HelloWorld/HelloWorld/settings.py Dateicode:

...
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR / "templates"],       # Hier ändern
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
        },
    },
]
...

Jetzt ändern wir views.py, um ein neues Objekt hinzuzufügen, das Daten an das Template übergibt:

Code der Datei HelloWorld/HelloWorld/views.py:

from django.shortcuts import render def example(request): context = {} context['hello'] = 'Hallo Welt!' return render(request, 'example.html', context)

Wie Sie sehen können, verwenden wir hier render, um das zuvor verwendete HttpResponse zu ersetzen. render nimmt auch ein Dictionary context als Parameter.

Die Schlüssel-Wert-Paare der Elemente im Context-Dictionary.helloEntspricht Variablen im Template{{ hello }}。

HelloWorld/HelloWorld/urls.py Datei-Code:

from django.contrib import admin from django.urls import path from . import views urlpatterns = [ path('admin/', admin.site.urls), path('example/', views.example), ]

Als Nächstes wechseln Sie in das Verzeichnis HelloWorld und führen Sie den folgenden Befehl aus, um den Server zu starten:

python3 manage.py runserver 0.0.0.0:8000

Erneut besuchenhttp://127.0.0.1:8000/example, können Sie die Seite sehen:

Auf diese Weise haben wir die Verwendung von Templates zur Ausgabe von Daten abgeschlossen und dadurch die Trennung von Daten und Views erreicht.

Als Nächstes werden wir die häufig verwendeten Syntaxregeln in Templates speziell vorstellen.


Django Template-Tags

Syntax:

{% tag %}

Template-Logik steuern, gängige Tags:

TagsZweck
{% for %}Schleifen über Listen/Wörterbücher
{% if %}Bedingte Prüfung
{% extends %}Basis-Template erben
{% block %}Inhaltsblöcke definieren, die von untergeordneten Templates überschrieben werden können
{% include %}Andere Template-Fragmente einbetten
{% url %}Reverse-Auflösung von (um hardcodierte Pfade zu vermeiden)
{% csrf_token %}CSRF-Token generieren (für POST-Formulare)

Variable

Template-Syntax:

view:{"HTML变量名" : "views变量名"}
HTML:{{变量名}}

Code der Datei HelloWorld/HelloWorld/views.py:

from django.shortcuts import render

def example(request):
  views_name = "Example"
  return  render(request,"example.html", {"name":views_name})

example.html in templates:

<p>{{ name }}</p>

Besuchen Sie http://127.0.0.1:8000/example erneut, und Sie können die Seite sehen:

Liste

In example.html in templates können Sie.verwenden, um das entsprechende Element über den Index-Subscript abzurufen.

Code der Datei HelloWorld/HelloWorld/views.py:

from django.shortcuts import render

def example(request):
    views_list = ["Rookie Tutorial 1","Rookie Tutorial 2","Rookie Tutorial 3"]
    return render(request, "example.html", {"views_list": views_list})

Code der Datei HelloWorld/templates/example.html:

<p>{{ views_list }}</p># Die gesamte Liste abrufen<p>{{ views_list.0 }}</p># Das erste Element der Liste nehmen

Besuchen Sie http://127.0.0.1:8000/example erneut, und Sie können die Seite sehen:

Wörterbuch

In example.html in templates können Sie.keyverwenden, um den entsprechenden Wert abzurufen.

Code der Datei HelloWorld/HelloWorld/views.py:

from django.shortcuts import render

def example(request):
    views_dict = {"name":"Example"}
    return render(request, "example.html", {"views_dict": views_dict})

Code der Datei HelloWorld/templates/example.html:

<p>{{ views_dict }}</p> <p>{{ views_dict.name }}</p>

Besuchen Sie http://127.0.0.1:8000/example erneut, und Sie können die Seite sehen:

Filter

Template-Syntax:
{{ Variable name | Filter: optional parameter }}

Template-Filter können eine Variable ändern, bevor sie angezeigt wird. Filter verwenden das Pipe-Zeichen, wie unten gezeigt:

{{ name|lower }}

Nachdem die Variable {{ name }} vom lower-Filter verarbeitet wurde, wird der Text von Großbuchstaben in Kleinbuchstaben umgewandelt.

Filter-Pipes können *verkettet* werden, das heißt, die Ausgabe einer Filter-Pipe kann als Eingabe für die nächste Pipe dienen:

{{ my_list|first|upper }}

Das obige Beispiel nimmt das erste Element und wandelt es in Großbuchstaben um.

Einige Filter haben Parameter. Filterparameter folgen nach einem Doppelpunkt und werden immer in doppelte Anführungszeichen eingeschlossen. Zum Beispiel:

{{ bio|truncatewords:"30" }}

Dies zeigt die ersten 30 Wörter der Variable bio an.

Weitere Filter:

  • addslashes: Fügt Backslashes vor allen Backslashes, einfachen Anführungszeichen oder doppelten Anführungszeichen hinzu.
  • date : Formatiert ein Datums- oder Datetime-Objekt gemäß dem angegebenen Format-String-Parameter. Beispiel:
    {{ pub_date|date:"F j, Y" }}
  • length: Gibt die Länge der Variable zurück.

default

default liefert einen Standardwert für die Variable.

Wenn der boolesche Wert der von views übergebenen Variable false ist, wird der angegebene Standardwert verwendet.

Die folgenden Werte sind false:

0  0.0  False  0j  ""  []  ()  set()  {}  None

Code der Datei HelloWorld/HelloWorld/views.py:

from django.shortcuts import render

def example(request):
    name =0
    return render(request, "example.html", {"name": name})

Code der Datei HelloWorld/templates/example.html:

{{ name|default:"Rookie Tutorial 666" }}

Besuchen Sie http://127.0.0.1:8000/example erneut, und Sie können die Seite sehen:

length

Gibt die Länge des Objekts zurück, anwendbar auf Strings und Listen.

Für ein Dictionary wird die Anzahl der Schlüssel-Wert-Paare zurückgegeben; für ein Set wird die Länge nach der Deduplizierung zurückgegeben.

Code der Datei HelloWorld/HelloWorld/views.py:

from django.shortcuts import render

def example(request):
    name ="Example"
    return render(request, "example.html", {"name": name})

Code der Datei HelloWorld/templates/example.html:

{{ name|length}}

Besuchen Sie http://127.0.0.1:8000/example erneut, und Sie können die Seite sehen:

filesizeformat

Zeigt die Dateigröße in einem besser lesbaren Format an (d. h. '13 KB', '4.1 MB', '102 bytes' usw.).

Für ein Dictionary wird die Anzahl der Schlüssel-Wert-Paare zurückgegeben; für ein Set wird die Länge nach der Deduplizierung zurückgegeben.

Code der Datei HelloWorld/HelloWorld/views.py:

from django.shortcuts import render

def example(request):
    num=1024
    return render(request, "example.html", {"num": num})

Code der Datei HelloWorld/templates/example.html:

{{ num|filesizeformat}}

Besuchen Sie http://127.0.0.1:8000/example erneut, und Sie können die Seite sehen:

date

Formatiert eine Datumsvariable gemäß einem angegebenen Format.

FormatierungY-m-d H:i:sreturnJahr-Monat-Tag Stunde:Minute:SekundeZeit im Format von.

Code der Datei HelloWorld/HelloWorld/views.py:

from django.shortcuts import render

def example(request):
    import datetime
    now  =datetime.datetime.now()
    return render(request, "example.html", {"time": now})

Code der Datei HelloWorld/templates/example.html:

{{ time|date:"Y-m-d" }}

Besuchen Sie http://127.0.0.1:8000/example erneut, und Sie können die Seite sehen:

truncatechars

Wenn die Gesamtzahl der Zeichen in einer Zeichenkette die angegebene Anzahl überschreitet, wird der nachfolgende Teil abgeschnitten.

Die abgeschnittene Zeichenkette endet mit...Endung.

Code der Datei HelloWorld/HelloWorld/views.py:

from django.shortcuts import render

def example(request):
    views_str = "Example"
    return render(request, "example.html", {"views_str": views_str})

Code der Datei HelloWorld/templates/example.html:

{{ views_str|truncatechars:2}}

Besuchen Sie http://127.0.0.1:8000/example erneut, und Sie können die Seite sehen:

safe

Markiert eine Zeichenkette als sicher und erfordert kein Escaping.

Verwende safe nur, wenn du garantieren kannst, dass die von views.py übergebenen Daten absolut sicher sind.

Es hat denselben Effekt wie mark_safe in der Backend-views.py.

Django escapt die von views.py an HTML-Dateien übergebene Tag-Syntax automatisch, wodurch ihre Semantik unwirksam wird. Das Hinzufügen des safe-Filters teilt Django mit, dass die Daten sicher sind und nicht escapt werden müssen, sodass die Datensemantik wirksam werden kann.

Code der Datei HelloWorld/HelloWorld/views.py:

from django.shortcuts import render

def example(request):
    views_str = "<a href='/index.html'>Zum Springen klicken</a>"
    return render(request, "example.html", {"views_str": views_str})

Code der Datei HelloWorld/templates/example.html:

{{ views_str|safe }}

Besuchen Sie http://127.0.0.1:8000/example erneut, und Sie können die Seite sehen:

if/else-Tag

Das grundlegende Syntaxformat ist wie folgt:

{% if condition %}
     ... display
{% endif %}

Oder:

{% if condition1 %}
   ... display 1
{% elif condition2 %}
   ... display 2
{% else %}
   ... display 3
{% endif %}

Legt fest, ob abhängig von Bedingungen ausgegeben wird. if/else unterstützt Verschachtelung.

Das {% if %}-Tag akzeptiert die Schlüsselwörter and, or und not, um mehrere Variablen auszuwerten oder eine Variable zu negieren (not), zum Beispiel:

{% if athlete_list and coach_list %}
     athletes 和 coaches 变量都是可用的。
{% endif %}

Code der Datei HelloWorld/HelloWorld/views.py:

from django.shortcuts import render

def example(request):
    views_num = 88
    return render(request, "example.html", {"num": views_num})

Code der Datei HelloWorld/templates/example.html:

{%if num > 90 and num <= 100%} Ausgezeichnet {%elif num > 60 and num <= 90%} Qualifiziert {%else%} Geh spielen~ {%endif %}

Besuchen Sie http://127.0.0.1:8000/example erneut, und Sie können die Seite sehen:

for-Tag

{% for %} ermöglicht es uns, über eine Sequenz zu iterieren.

Ähnlich wie bei Pythons for-Anweisung ist die Schleifensyntax for X in Y, wobei Y die Sequenz ist, über die iteriert wird, und X der Variablenname, der in jeder einzelnen Schleife verwendet wird.

In jeder Schleife rendert das Template-System den gesamten Inhalt zwischen{% for %}und{% endfor %}.

Zum Beispiel können wir mit einer Athletenlisten-Variable athlete_list den folgenden Code verwenden, um diese Liste anzuzeigen:
<ul>
{% for athlete in athlete_list %}
    <li>{{ athlete.name }}</li>
{% endfor %}
</ul>

Code der Datei HelloWorld/HelloWorld/views.py:

from django.shortcuts import render

def example(request):
    views_list = ["Beispiel","Anfänger-Tutorial 1","Anfänger-Tutorial 2","Anfänger-Tutorial 3",]
    return render(request, "example.html", {"views_list": views_list})

Code der Datei HelloWorld/templates/example.html:

{% for i in views_list %} {{ i }} {% endfor %}

Besuchen Sie http://127.0.0.1:8000/example erneut, und Sie können die Seite sehen:

Fügen Sie dem Tag ein reversed hinzu, damit die Liste in umgekehrter Reihenfolge durchlaufen wird:

{% for athlete in athlete_list reversed %}
...
{% endfor %}

Code der Datei HelloWorld/templates/example.html:

{% for i in views_list reversed%} {{ i }} {% endfor %}

Besuchen Sie http://127.0.0.1:8000/example erneut, und Sie können die Seite sehen:

Dictionary durchlaufen: Sie können direkt eine Dictionary.items-Methode verwenden: Nutzen Sie Variablen-Entpackung, um Schlüssel und Werte getrennt zu erhalten.

Code der Datei HelloWorld/HelloWorld/views.py:

from django.shortcuts import render

def example(request):
    views_dict = {"name":"Beispiel","age":18}
    return render(request, "example.html", {"views_dict": views_dict})

Code der Datei HelloWorld/templates/example.html:

{% for i,j in views_dict.items %} {{ i }}---{{ j }} {% endfor %}

Besuchen Sie http://127.0.0.1:8000/example erneut, und Sie können die Seite sehen:

Im {% for %}-Tag können Sie den Schleifenindex über die Variable {{forloop}} abrufen.
  • forloop.counter: Ruft den Schleifenindex in der Reihenfolge ab, beginnend bei 1.
  • forloop.counter0: Ruft den Schleifenindex in der Reihenfolge ab, beginnend bei 0.
  • forloop.revcounter: Ruft den Schleifenindex in umgekehrter Reihenfolge ab, wobei der letzte Index 1 ist.
  • forloop.revcounter0: Ruft den Schleifenindex in umgekehrter Reihenfolge ab, wobei der letzte Index 0 ist.
  • forloop.first (wird normalerweise mit dem if-Tag verwendet): Gibt True für das erste Element zurück, False für andere.
  • forloop.last (wird normalerweise mit dem if-Tag verwendet): Gibt True für das letzte Element zurück, False für andere.

Code der Datei HelloWorld/HelloWorld/views.py:

from django.shortcuts import render

def example(request):
     views_list = ["a", "b", "c", "d", "e"]
     return render(request, "example.html", {"listvar": views_list})

Code der Datei HelloWorld/templates/example.html:

{% for i in listvar %} {{ forloop.counter }} {{ forloop.counter0 }} {{ forloop.revcounter }} {{ forloop.revcounter0 }} {{ forloop.first }} {{ forloop.last }} {% endfor %}

Besuchen Sie http://127.0.0.1:8000/example erneut, und Sie können die Seite sehen:

{% empty %}

Optional {% empty %} Klausel: Sie wird ausgeführt, wenn die Schleife leer ist (d. h. wenn der boolesche Wert des Arguments nach in False ist).

Code der Datei HelloWorld/HelloWorld/views.py:

from django.shortcuts import render

def example(request):
  views_list = []
  return render(request, "example.html", {"listvar": views_list})

Code der Datei HelloWorld/templates/example.html:

{% for i in listvar %} {{ forloop.counter0 }} {% empty %} LeerLeerZum Beispiel auch~ {% endfor %}

Besuchen Sie http://127.0.0.1:8000/example erneut, und Sie können die Seite sehen:

Das {% for %} Tag kann verschachtelt werden:

{% for athlete in athlete_list %}
    <h1>{{ athlete.name }}</h1>
    <ul>
    {% for sport in athlete.sports_played %}
        <li>{{ sport }}</li>
    {% endfor %}
    </ul>
{% endfor %}

Kommentar-Tag

Django-Kommentare verwenden {# #}.

{# This is a comment #}

include-Tag

Das Tag {% include %} ermöglicht es, den Inhalt anderer Templates in ein Template einzubinden.

Das folgende Beispiel bindet das Template nav.html ein:

{% include "nav.html" %}

csrf_token

csrf_token wird in Form-Formularen verwendet, und seine Funktion ist der Schutz vor Cross-Site-Request-Forgery.

Wenn nicht verwendet{% csrf_token %}Tag: Wenn bei Verwendung eines Formulars erneut auf eine Seite weitergeleitet werden muss, wird ein 403-Berechtigungsfehler gemeldet.

Verwendet{% csrf_token %}Tag: Es ist nur erfolgreich, wenn Daten über ein Formular übermittelt werden.

Analyse:

Senden Sie zunächst eine Anfrage an den Server, um die Anmeldeseite zu erhalten. Zu diesem Zeitpunkt generiert die CSRF-Middleware automatisch ein verstecktes input-Tag. Das value-Attribut in diesem Tag ist eine zufällige Zeichenkette. Wenn der Benutzer die Anmeldeseite erhält, erhält er auch dieses versteckte input-Tag.

Wenn der Benutzer dann ein Formular verwenden muss, um Daten zu übermitteln, wird dieses input-Tag mitgeführt und an die CSRF-Middleware übermittelt. Der Grund dafür ist, dass ein Formular beim Übermitteln von Daten alle input-Tags einschließt. Wenn die CSRF-Middleware die Daten empfängt, ermittelt sie, ob diese zufällige Zeichenkette diejenige ist, die sie dem Benutzer beim ersten Mal gesendet hat. Wenn ja, ist die Datenübermittlung erfolgreich; wenn nicht, gibt sie einen 403-Berechtigungsfehler zurück.


Benutzerdefinierte Tags und Filter

1. Erstellen Sie im Anwendungsverzeichnis dastemplatetags-Verzeichnis (auf derselben Ebene wie das templates-Verzeichnis, der Verzeichnisname darf nur templatetags sein).

HelloWorld/
|-- HelloWorld
|   |-- __init__.py
|   |-- __init__.pyc
|   |-- settings.py
...
|-- manage.py
`-- templatetags
`-- templates

2. Erstellen Sie eine beliebige py-Datei im templatetags-Verzeichnis, z. B.:my_tags.py。

3. Der Code der Datei my_tags.py lautet wie folgt:

from django import template

register = template.Library()   #register的名字是固定的,不可改变

Ändern Sie die Konfiguration der Option TEMPLATES in der Datei settings.py und fügen Sie die libraries-Konfiguration hinzu:

settings.py-Konfigurationsdatei

...
TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.django.DjangoTemplates',
        'DIRS': [BASE_DIR, "/templates",],
        'APP_DIRS': True,
        'OPTIONS': {
            'context_processors': [
                'django.template.context_processors.debug',
                'django.template.context_processors.request',
                'django.contrib.auth.context_processors.auth',
                'django.contrib.messages.context_processors.messages',
            ],
            "libraries":{                          # Fügen Sie hier diese drei Konfigurationszeilen hinzu
                'my_tags':'templatetags.my_tags'   # Fügen Sie hier diese drei Konfigurationszeilen hinzu
            }                                      # Fügen Sie hier diese drei Konfigurationszeilen hinzu
        },
    },
]
...

4. Verwenden Sie den Dekorator @register.filter, um einen benutzerdefinierten Filter zu definieren.

Hinweis:Der Dekorator kann höchstens 2 Parameter haben.

@register.filter
def my_filter(v1, v2):
    return v1 * v2

5. Verwenden Sie den Dekorator @register.simple_tag, um ein benutzerdefiniertes Tag zu definieren.

@register.simple_tag
def my_tag1(v1, v2, v3):
    return v1 * v2 * v3

6. Bevor Sie benutzerdefinierte Tags und Filter verwenden, müssen Sie diese py-Datei ganz oben im Body der HTML-Datei importieren.

{% load my_tags %}

7. Verwenden Sie benutzerdefinierte Filter in HTML.

{{ 11|my_filter:22 }}

8. Benutzerdefinierte Tags in HTML verwenden.

{% my_tag1 11 22 33 %}

9. Semantische Tags

Importiere mark_safe in dieser py-Datei.

from django.utils.safestring import mark_safe

Verwende beim Definieren von Tags die mark_safe-Methode, um die Tags semantisch zu machen, was der html()-Methode in jQuery entspricht.

Es hat dieselbe Wirkung wie der safe-Filter in Frontend-HTML-Dateien.

@register.simple_tag
def my_html(v1, v2):
    temp_html = "<input type='text' id='%s' class='%s' />" %(v1, v2)
    return mark_safe(temp_html)

Verwende dieses benutzerdefinierte Tag in HTML, um Tags dynamisch auf der Seite zu erstellen.

{% my_html "zzz" "xxx" %}

Statische Dateien konfigurieren

1. Erstelle ein statics-Verzeichnis im Projektstammverzeichnis.

2. Füge die folgende Konfiguration am Ende der settings-Datei hinzu:

STATIC_URL = '/static/' # 别名 
STATICFILES_DIRS = [ 
    os.path.join(BASE_DIR, "statics"), 
]

3. Erstelle die Verzeichnisse css, js, images und plugins unter dem statics-Verzeichnis, um darin CSS-Dateien, JS-Dateien, Bilder bzw. Plugins abzulegen.

4. Lege das Bootstrap-Framework in das plugins-Verzeichnis.

5. Importiere Bootstrap im head-Tag der HTML-Datei.

Hinweis:An dieser Stelle sollte im Referenzpfad der Alias static aus der Konfigurationsdatei verwendet werden, nicht das Verzeichnis statics.

<link rel="stylesheet" href="../static/plugins/bootstrap-3.3.7/dist/css/bootstrap.css.html">

Um es in Templates zu verwenden, müssen Sie{% load static %}Code hinzufügen. Im folgenden Beispiel importieren wir ein Bild aus dem static-Verzeichnis.

Code der Datei HelloWorld/HelloWorld/views.py:

from django.shortcuts import render

def example(request):
    name ="Example"
    return render(request, "example.html", {"name": name})

Code der Datei HelloWorld/templates/example.html:

{% load static %} {{name}}<img src="{% static 'images/example-logo.png' %}" alt="example-logo">

Besuchen Sie http://127.0.0.1:8000/example erneut, und Sie können die Seite sehen:


Template-Vererbung

Templates können durch Vererbung wiederverwendet werden, wodurch redundanter Inhalt reduziert wird.

Der Header- und Footer-Inhalt einer Webseite ist im Allgemeinen einheitlich, daher können wir die Template-Vererbung verwenden, um Wiederverwendung zu erreichen.

Das übergeordnete Template wird verwendet, um wiederverwendbaren Inhalt zu platzieren, und das untergeordnete Template erbt den Inhalt des übergeordneten Templates und platziert seinen eigenen Inhalt.

übergeordnetes Template

Tag block...endblock:Die reservierten Blöcke im übergeordneten Template sind dafür vorgesehen, dass das untergeordnete Template sie mit differenziertem Inhalt füllt. Unterschiedliche reservierte Blöcke dürfen nicht denselben Namen haben.

{% block 名称 %} 
预留给子模板的区域,可以设置设置默认内容
{% endblock 名称 %}

untergeordnetes Template

Das untergeordnete Template verwendet das extends-Tag, um das übergeordnete Template zu erben:

{% extends "父模板路径"%} 

Wenn das untergeordnete Template den Inhalt der reservierten Blöcke des übergeordneten Templates nicht setzt, wird der im übergeordneten Template festgelegte Standardinhalt verwendet. Natürlich können Sie sie auch ungesetzt lassen, dann bleiben sie leer.

Das Kind-Template legt den Inhalt der reservierten Blöcke des übergeordneten Templates fest:

{ % block 名称 % }
内容 
{% endblock 名称 %}

Als Nächstes erstellen wir zuerst eine base.html-Datei im templates-Verzeichnis des vorherigen Projekts. Der Code lautet wie folgt:

HelloWorld/templates/base.html Dateicode:

<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Beispiel (example.com)</title> </head> <body> <h1>Hallo Welt!</h1> <p>Beispiel Django-Test.</p> {% block mainbody %} <p>original</p> {% endblock %} </body> </html>

Im Code ist das block-Tag mainbody der Teil, der von Erben ersetzt werden kann.

Alle {% block %}-Tags teilen der Template-Engine mit, dass Kind-Templates diese Teile überschreiben können.

In example.html wird base.html geerbt und bestimmte Blöcke werden ersetzt. Der geänderte example.html-Code lautet wie folgt:

Code der Datei HelloWorld/templates/example.html:

{%extends "base.html" %} {% block mainbody %} <p> Geerbtebase.htmlDatei</p> {% endblock %}

Die erste Codezeile gibt an, dass example.html die Datei base.html erbt. Man kann sehen, dass block-Tags mit demselben Namen hier verwendet werden, um die entsprechenden Blöcke in base.html zu ersetzen.

Rufen Sie die Adresse http://127.0.0.1:8000/example erneut auf, die Ausgabe ist wie folgt:

Weitere Erweiterungen