Django
Templating
Suche…
Variablen
Auf Variablen, die Sie in Ihrem Ansichtskontext bereitgestellt haben, können Sie in doppelter geschweiften Klammer darauf zugreifen:
In deinen views.py
:
class UserView(TemplateView):
""" Supply the request user object to the template """
template_name = "user.html"
def get_context_data(self, **kwargs):
context = super(UserView, self).get_context_data(**kwargs)
context.update(user=self.request.user)
return context
In user.html
:
<h1>{{ user.username }}</h1>
<div class="email">{{ user.email }}</div>
Die Punktnotation greift zu:
- Eigenschaften des Objekts, zB
user.username
ist{{ user.username }}
- Wörterbuchsuche, zB
request.GET["search"]
wird{{ request.GET.search }}
- Methoden ohne Argumente, zB
users.count()
wird{{ user.count }}
Vorlagenvariablen können nicht auf Methoden zugreifen, die Argumente akzeptieren.
Variablen können auch getestet und übergangen werden:
{% if user.is_authenticated %}
{% for item in menu %}
<li><a href="{{ item.url }}">{{ item.name }}</a></li>
{% endfor %}
{% else %}
<li><a href="{% url 'login' %}">Login</a>
{% endif %}
Auf URLs wird im Format {% url 'name' %}
zugegriffen, wobei die Namen den Namen in Ihrer urls.py
.
{% url 'login' %}
- Wird wahrscheinlich als /accounts/login/
{% url 'user_profile' user.id %}
- Argumente für URLs werden in der angegebenen Reihenfolge angegeben
{% url next %}
- URLs können Variablen sein
Schablonen in klassenbasierten Ansichten
Sie können Daten in einer benutzerdefinierten Variablen an eine Vorlage übergeben.
In deinen views.py
:
from django.views.generic import TemplateView
from MyProject.myapp.models import Item
class ItemView(TemplateView):
template_name = "item.html"
def items(self):
""" Get all Items """
return Item.objects.all()
def certain_items(self):
""" Get certain Items """
return Item.objects.filter(model_field="certain")
def categories(self):
""" Get categories related to this Item """
return Item.objects.get(slug=self.kwargs['slug']).categories.all()
Eine einfache Liste in Ihrer item.html
:
{% for item in view.items %}
<ul>
<li>{{ item }}</li>
</ul>
{% endfor %}
Sie können auch zusätzliche Eigenschaften der Daten abrufen.
Angenommen , Ihr Modell Item
hat einen name
Feld:
{% for item in view.certain_items %}
<ul>
<li>{{ item.name }}</li>
</ul>
{% endfor %}
Vorlagen in funktionsbasierten Ansichten
Sie können eine Vorlage in einer funktionsbasierten Ansicht wie folgt verwenden:
from django.shortcuts import render
def view(request):
return render(request, "template.html")
Wenn Sie Vorlagenvariablen verwenden möchten, haben Sie folgende Möglichkeiten:
from django.shortcuts import render
def view(request):
context = {"var1": True, "var2": "foo"}
return render(request, "template.html", context=context)
In template.html
können Sie dann wie folgt auf Ihre Variablen verweisen:
<html>
{% if var1 %}
<h1>{{ var2 }}</h1>
{% endif %}
</html>
Vorlagenfilter
Das Django-Schablonensystem verfügt über integrierte Tags und Filter , die Funktionen in der Schablone sind, um Inhalte auf bestimmte Weise darzustellen. Mit Pipes können mehrere Filter angegeben werden, und Filter können wie in der Variablensyntax Argumente enthalten.
{{ "MAINROAD 3222"|lower }} # mainroad 3222
{{ 10|add:15}} # 25
{{ "super"|add:"glue" }} # superglue
{{ "A7"|add:"00" }} # A700
{{ myDate | date:"D d M Y"}} # Wed 20 Jul 2016
Eine Liste der verfügbaren integrierten Filter finden Sie unter https://docs.djangoproject.com/de/dev/ref/templates/builtins/#ref-templates-builtins-filters .
Benutzerdefinierte Filter erstellen
Erstellen Sie zum Hinzufügen eigener Vorlagenfilter einen Ordner namens templatetags
in Ihrem App-Ordner. __init__.py
dann ein __init__.py
und die Datei Ihrer Datei hinzu, die die Filter enthalten wird:
#/myapp/templatetags/filters.py
from django import template
register = template.Library()
@register.filter(name='tostring')
def to_string(value):
return str(value)
Um den Filter tatsächlich verwenden zu können, müssen Sie ihn in Ihre Vorlage laden:
#templates/mytemplate.html
{% load filters %}
{% if customer_id|tostring = customer %} Welcome back {% endif%}
Tricks
Auch wenn die Filter auf den ersten Blick einfach erscheinen, können Sie einige einfache Dinge tun:
{% for x in ""|ljust:"20" %}Hello World!{% endfor %} # Hello World!Hello World!Hel...
{{ user.name.split|join:"_" }} ## replaces whitespace with '_'
Weitere Informationen finden Sie auch unter Vorlagen-Tags .
Verhindern, dass sensible Methoden in Vorlagen aufgerufen werden
Wenn ein Objekt für den Vorlagenkontext verfügbar gemacht wird, sind die Methoden ohne Argumente verfügbar. Dies ist nützlich, wenn diese Funktionen "Getter" sind. Es kann jedoch gefährlich sein, wenn diese Methoden einige Daten ändern oder Nebenwirkungen haben. Obwohl Sie dem Schreiber der Vorlage wahrscheinlich vertrauen, ist er möglicherweise nicht auf die Nebenwirkungen einer Funktion aufmerksam oder meint, das falsche Attribut fälschlicherweise anzurufen.
Gegeben das folgende Modell:
class Foobar(models.Model):
points_credit = models.IntegerField()
def credit_points(self, nb_points=1):
"""Credit points and return the new points credit value."""
self.points_credit = F('points_credit') + nb_points
self.save(update_fields=['points_credit'])
return self.points_credit
Wenn Sie dies versehentlich in eine Vorlage schreiben:
You have {{ foobar.credit_points }} points!
Dadurch wird die Anzahl der Punkte bei jedem Aufruf der Vorlage erhöht. Und Sie bemerken es vielleicht gar nicht.
Um dies zu verhindern, müssen Sie das alters_data
Attribut auf True
um Methoden zu erhalten, die Nebenwirkungen haben. Dies macht es unmöglich, sie von einer Vorlage aus aufzurufen.
def credit_points(self, nb_points=1):
"""Credit points and return the new points credit value."""
self.points_credit = F('points_credit') + nb_points
self.save(update_fields=['points_credit'])
return self.points_credit
credit_points.alters_data = True
Verwendung von {% extend%}, {% include%} und {% blocks%}
Zusammenfassung
{% extend%} : Hiermit wird die als Argument angegebene Vorlage zum übergeordneten Element der aktuellen Vorlage erklärt. Verwendung:
{% extends 'parent_template.html' %}
.{% block%} {% endblock%} : Dies wird zum Definieren von Abschnitten in Ihren Vorlagen verwendet. Wenn also eine andere Vorlage diese erweitert, kann sie den in ihr enthaltenen HTML-Code ersetzen. Blöcke werden durch ihren Namen identifiziert. Verwendung:
{% block content %} <html_code> {% endblock %}
.{% include%} : Hiermit wird eine Vorlage in die aktuelle Vorlage eingefügt. Beachten Sie, dass die enthaltene Vorlage den Kontext der Anforderung empfängt. Sie können auch benutzerdefinierte Variablen angeben. Grundlegende Verwendung:
{% include 'template_name.html' %}
, Verwendung mit Variablen:{% include 'template_name.html' with variable='value' variable2=8 %}
Führen
Angenommen, Sie bauen Ihren Front-End-Code mit gemeinsamen Layouts für den gesamten Code auf und möchten den Code nicht für jede Vorlage wiederholen. Django gibt Ihnen dafür eingebaute Tags.
Angenommen, wir haben eine Blog-Website mit drei Vorlagen, die dasselbe Layout haben:
project_directory
..
templates
front-page.html
blogs.html
blog-detail.html
1) base.html
Datei definieren,
<html>
<head>
</head>
<body>
{% block content %}
{% endblock %}
</body>
</html>
2) Erweitern Sie es in blog.html
wie
{% extends 'base.html' %}
{% block content %}
# write your blog related code here
{% endblock %}
# None of the code written here will be added to the template
Hier haben wir das blog.html
erweitert, sodass das HTML-Layout nun in der blog.html
blog.html zur Verfügung blog.html
Das Konzept von { % block %}
ist die Vererbung von Vorlagen, mit der Sie eine Basisvorlage mit "Skelett" erstellen können, die alle gängigen Elemente Ihres Systems enthält Site und definiert Blöcke, die untergeordnete Vorlagen überschreiben können.
3) Nehmen Sie nun an, alle Ihre 3 Vorlagen haben das gleiche HTML-Div, das einige beliebte Posts definiert. Statt die 3-mal geschrieben zu werden, erstellen Sie eine neue Vorlage posts.html
.
blog.html
{% extends 'base.html' %}
{% block content %}
# write your blog related code here
{% include 'posts.html' %} # includes posts.html in blog.html file without passing any data
<!-- or -->
{% include 'posts.html' with posts=postdata %} # includes posts.html in blog.html file with passing posts data which is context of view function returns.
{% endblock %}