Zoeken…


Variabelen

Variabelen die u in uw weergavecontext hebt opgegeven, zijn toegankelijk via dubbele accolades:

In uw 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>

De puntnotatie geeft toegang tot:

  • eigenschappen van het object, bijv. user.username is {{ user.username }}
  • zoeken in woordenboeken, bijv. request.GET["search"] zal {{ request.GET.search }}
  • methoden zonder argumenten, bijvoorbeeld users.count() zijn {{ user.count }}

Sjabloonvariabelen hebben geen toegang tot methoden waarvoor argumenten nodig zijn.

Variabelen kunnen ook worden getest en doorgelust:

{% 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 %}

URL's worden geopend met de indeling {% url 'name' %} , waarbij de namen overeenkomen met namen in uw urls.py

{% url 'login' %} - Wordt waarschijnlijk weergegeven als /accounts/login/
{% url 'user_profile' user.id %} - Argumenten voor URL's worden op volgorde geleverd
{% url next %} - URL's kunnen variabelen zijn

Templeren in op klassen gebaseerde weergaven

U kunt gegevens doorgeven aan een sjabloon in een aangepaste variabele.

In uw 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()

Een eenvoudige lijst in uw item.html :

{% for item in view.items %}
<ul>        
    <li>{{ item }}</li>
</ul>
{% endfor %}

U kunt ook extra eigenschappen van de gegevens ophalen.

Ervan uitgaande dat uw model Item heeft een name veld:

{% for item in view.certain_items %}
<ul>        
    <li>{{ item.name }}</li>
</ul>
{% endfor %}

Templeren in op functies gebaseerde weergaven

U kunt als volgt een sjabloon in een functiegebaseerde weergave gebruiken:

from django.shortcuts import render

def view(request):
    return render(request, "template.html")

Als u sjabloonvariabelen wilt gebruiken, kunt u dit als volgt doen:

from django.shortcuts import render

def view(request):
    context = {"var1": True, "var2": "foo"}
    return render(request, "template.html", context=context)

Vervolgens kunt u in template.html als volgt naar uw variabelen verwijzen:

<html>
{% if var1 %}
    <h1>{{ var2 }}</h1>
{% endif %}
</html>

Sjabloonfilters

Het Django-sjabloonsysteem heeft ingebouwde tags en filters , functies in de sjabloon om inhoud op een specifieke manier weer te geven. Meerdere filters kunnen worden opgegeven met pijpen en filters kunnen argumenten hebben, net als bij variabele syntaxis.

{{ "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   

Een lijst met beschikbare ingebouwde filters is te vinden op https://docs.djangoproject.com/en/dev/ref/templates/builtins/#ref-templates-builtins-filters .

Aangepaste filters maken

Om uw eigen sjabloonfilters toe te voegen, maakt u een map met de naam templatetags in uw app-map. Voeg vervolgens een __init__.py en het bestand dat uw bestand bevat met de filters:

#/myapp/templatetags/filters.py
from django import template

register = template.Library()

@register.filter(name='tostring')
def to_string(value):
    return str(value)

Om het filter daadwerkelijk te gebruiken, moet u het in uw sjabloon laden:

#templates/mytemplate.html
{% load filters %}
{% if customer_id|tostring = customer %} Welcome back {% endif%}

Trucs

Hoewel de filters in het begin eenvoudig lijken, kunnen er enkele handige dingen worden gedaan:

{% for x in ""|ljust:"20" %}Hello World!{% endfor %}    # Hello World!Hello World!Hel...    
{{ user.name.split|join:"_" }} ## replaces whitespace with '_' 

Zie ook sjabloontags voor meer informatie.

Voorkom dat gevoelige methoden in sjablonen worden aangeroepen

Wanneer een object wordt blootgesteld aan de sjablooncontext, zijn de methoden zonder argumenten beschikbaar. Dit is handig wanneer deze functies "getters" zijn. Maar het kan gevaarlijk zijn als deze methoden sommige gegevens wijzigen of sommige bijwerkingen hebben. Hoewel u de sjabloonschrijver waarschijnlijk vertrouwt, is hij zich mogelijk niet bewust van de bijwerkingen van een functie of denkt hij per ongeluk het verkeerde kenmerk te noemen.

Gegeven het volgende model:

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

Als u dit per ongeluk in een sjabloon schrijft:

 You have {{ foobar.credit_points }} points!

Dit verhoogt het aantal punten telkens wanneer de sjabloon wordt opgeroepen. En je merkt het misschien niet eens.

Om dit te voorkomen, moet u het kenmerk alters_data op True voor methoden met bijwerkingen. Dit maakt het onmogelijk om ze vanuit een sjabloon op te roepen.

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

Gebruik van {% verlengt%}, {% include%} en {% blokken%}

samenvatting

  • {% verlengt%} : hiermee wordt de sjabloon als argument opgegeven als de bovenliggende sjabloon van de huidige sjabloon. Gebruik: {% extends 'parent_template.html' %} .

  • {% block%} {% endblock%} : dit wordt gebruikt om secties in uw sjablonen te definiëren, zodat als een andere sjabloon deze uitbreidt, deze de HTML-code die erin is geschreven, kan vervangen. Blokken worden geïdentificeerd door hun naam. Gebruik: {% block content %} <html_code> {% endblock %} .

  • {% include%} : hiermee wordt een sjabloon in de huidige sjabloon ingevoegd. Houd er rekening mee dat de opgenomen sjabloon de context van het verzoek ontvangt en dat u het ook aangepaste variabelen kunt geven. Basisgebruik: {% include 'template_name.html' %} , gebruik met variabelen: {% include 'template_name.html' with variable='value' variable2=8 %}

Gids

Stel dat u uw front-side code opbouwt met gemeenschappelijke lay-outs voor alle code en dat u de code niet voor elke sjabloon wilt herhalen. Django geeft je hiervoor ingebouwde tags.
Stel dat we één blogwebsite hebben met 3 sjablonen die dezelfde lay-out delen:

project_directory
    ..
    templates
      front-page.html
      blogs.html
      blog-detail.html

1) Definieer base.html bestand,

<html>
  <head>
  </head>

  <body>
        {% block content %}
        {% endblock %}
   </body>
</html>

2) Breid het uit in blog.html zoals,

{% 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 hebben we de blog.html out uitgebreid, zodat de HTML-lay-out nu beschikbaar is in het blog.html bestand. Het concept van { % block %} is sjabloonovererving waarmee u een basisskelet voor een skelet kunt maken dat alle gemeenschappelijke elementen van uw site en definieert blokken die onderliggende sjablonen kunnen overschrijven.

3) Stel nu dat al je 3 templates ook met dezelfde HTML div die een aantal populaire posts.Instead van wordt geschreven de 3 keer creëren een nieuwe template definieert 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 %}


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow