Sök…


variabler

Variabler som du har tillhandahållit i ditt visningssammanhang kan nås med dubbelstångsnotation:

I dina 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

I user.html :

<h1>{{ user.username }}</h1>

<div class="email">{{ user.email }}</div>

Punktnotationen kommer åt:

  • objektets egenskaper, t.ex. user.username kommer att vara {{ user.username }}
  • ordboksökningar, t.ex. request.GET["search"] kommer att {{ request.GET.search }}
  • metoder utan argument, t.ex. users.count() kommer att {{ user.count }}

Mallvariabler kan inte komma åt metoder som tar argument.

Variabler kan också testas och slingas över:

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

Webbadresser öppnas med formatet {% url 'name' %} , där namnen motsvarar namnen i din urls.py

{% url 'login' %} - Kommer förmodligen att visas som /accounts/login/
{% url 'user_profile' user.id %} - Argument för webbadresser levereras i ordning
{% url next %} - URL: er kan vara variabler

Templera i klassbaserade vyer

Du kan skicka data till en mall i en anpassad variabel.

I dina 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()

En enkel lista i item.html :

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

Du kan också hämta ytterligare egenskaper för data.

Förutsatt din modell Item har ett name fält:

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

Templera i funktionsbaserade vyer

Du kan använda en mall i en funktionsbaserad vy enligt följande:

from django.shortcuts import render

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

Om du vill använda mallvariabler kan du göra det enligt följande:

from django.shortcuts import render

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

Sedan kan du i template.html referera till dina variabler så:

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

Mallfilter

Django-mallssystemet har inbyggda taggar och filter , som är funktioner i mallen för att återge innehåll på ett specifikt sätt. Flera filter kan specificeras med rör och filter kan ha argument, precis som i variabel syntax.

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

En lista över tillgängliga inbyggda filter finns på https://docs.djangoproject.com/sv/dev/ref/templates/builtins/#ref-templates-builtins-filters .

Skapa anpassade filter

Om du vill lägga till dina egna mallfilter skapar du en mapp med namnet templatetags i din appmapp. Lägg sedan till en __init__.py och filen din fil som kommer att innehålla filtren:

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

register = template.Library()

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

För att faktiskt använda filtret måste du ladda det i din mall:

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

tricks

Även om filtren verkar enkla till en början gör det några fina saker:

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

Se även malltaggar för mer information.

Förhindra att känsliga metoder kallas i mallar

När ett objekt exponeras för mallens sammanhang, är dess metoder utan argument tillgängliga. Detta är användbart när dessa funktioner är "getters". Men det kan vara farligt om dessa metoder förändrar vissa data eller har vissa biverkningar. Även om du förmodligen litar på mallen författare, kanske han inte är medveten om en funktions biverkningar eller tror att fel fel attribut av misstag.

Följande 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

Om du skriver detta, av misstag, i en mall:

 You have {{ foobar.credit_points }} points!

Detta ökar antalet poäng varje gång mallen anropas. Och du kanske inte ens märker det.

För att förhindra detta måste du ställa alters_data attributet alters_data till True till metoder som har biverkningar. Detta kommer att göra det omöjligt att ringa dem från en mall.

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

Användning av {% extends%}, {% include%} och {% blocks%}

sammanfattning

  • {% extends%} : detta förklarar den mall som ges som ett argument som den aktuella mallens överordnade. Användning: {% extends 'parent_template.html' %} .

  • {% block%} {% endblock%} : Detta används för att definiera avsnitt i dina mallar, så att om en annan mall utökar den här, kommer den att kunna ersätta vilken HTML-kod som har skrivits inuti den. Block identifieras med deras namn. Användning: {% block content %} <html_code> {% endblock %} .

  • {% include%} : detta kommer att infoga en mall i den nuvarande. Var medveten om att den medföljande mallen kommer att få förfrågningens sammanhang, och du kan också ge den anpassade variabler. Grundläggande användning: {% include 'template_name.html' %} , användning med variabler: {% include 'template_name.html' with variable='value' variable2=8 %}

Guide

Anta att du bygger upp din front-end-sidkod med gemensamma layouter för all kod och du vill inte upprepa koden för varje mall. Django ger dig inbyggda taggar för att göra det.
Anta att vi har en bloggsida med tre mallar som delar samma layout:

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

1) Definiera base.html fil,

<html>
  <head>
  </head>

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

2) Utöka det i blog.html som,

{% extends 'base.html' %}

{% block content %}
    # write your blog related code here
{% endblock %}

# None of the code written here will be added to the template

Här utvidgade vi baslayouten så att dess HTML-layout nu är tillgänglig i blog.html filen. Konceptet med { % block %} är mallarv som gör att du kan bygga en basskelettmall som innehåller alla vanliga element i din webbplats och definierar block som mallar för barn kan åsidosätta.

3) Anta nu att alla dina tre mallar också har samma HTML-div som definierar några populära inlägg. Istället för att skrivas de tre gångerna skapar du en ny mall- 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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow