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.
| Funktionen | Syntax/Beispiele | Anwendbare 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.filter | Template-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:
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:
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:
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:
| Tags | Zweck |
|---|---|
{% 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:
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:
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:
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:
def example(request):
views_dict = {"name":"Example"}
return render(request, "example.html", {"views_dict": views_dict})
Code der Datei HelloWorld/templates/example.html:
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:
def example(request):
name =0
return render(request, "example.html", {"name": name})
Code der Datei HelloWorld/templates/example.html:
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:
def example(request):
name ="Example"
return render(request, "example.html", {"name": name})
Code der Datei HelloWorld/templates/example.html:
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:
def example(request):
num=1024
return render(request, "example.html", {"num": num})
Code der Datei HelloWorld/templates/example.html:
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:
def example(request):
import datetime
now =datetime.datetime.now()
return render(request, "example.html", {"time": now})
Code der Datei HelloWorld/templates/example.html:
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:
def example(request):
views_str = "Example"
return render(request, "example.html", {"views_str": views_str})
Code der Datei HelloWorld/templates/example.html:
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:
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:
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:
def example(request):
views_num = 88
return render(request, "example.html", {"num": views_num})
Code der Datei HelloWorld/templates/example.html:
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:
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:
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:
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:
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:
Besuchen Sie http://127.0.0.1:8000/example erneut, und Sie können die Seite sehen:

- 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:
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:
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:
def example(request):
views_list = []
return render(request, "example.html", {"listvar": views_list})
Code der Datei HelloWorld/templates/example.html:
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:
def example(request):
name ="Example"
return render(request, "example.html", {"name": name})
Code der Datei HelloWorld/templates/example.html:
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:
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:
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:
