Django - Système de modèles

Django permet de séparer python et HTML, le python va dans les vues et HTML va dans les templates. Pour lier les deux, Django s'appuie sur la fonction de rendu et le langage Django Template.

La fonction de rendu

Cette fonction prend trois paramètres -

  • Request - La demande initiale.

  • The path to the template - Il s'agit du chemin relatif à l'option TEMPLATE_DIRS dans les variables project settings.py.

  • Dictionary of parameters- Un dictionnaire contenant toutes les variables nécessaires dans le modèle. Cette variable peut être créée ou vous pouvez utiliser locals () pour transmettre toutes les variables locales déclarées dans la vue.

Django Template Language (DTL)

Le moteur de template de Django propose un mini-langage pour définir la couche face à l'utilisateur de l'application.

Affichage des variables

Une variable ressemble à ceci: {{variable}}. Le modèle remplace la variable par la variable envoyée par la vue dans le troisième paramètre de la fonction de rendu. Modifions notre hello.html pour afficher la date du jour -

hello.html

<html>
   
   <body>
      Hello World!!!<p>Today is {{today}}</p>
   </body>
   
</html>

Ensuite, notre point de vue changera en -

def hello(request):
   today = datetime.datetime.now().date()
   return render(request, "hello.html", {"today" : today})

Nous allons maintenant obtenir la sortie suivante après avoir accédé à l'URL / myapp / hello -

Hello World!!!
Today is Sept. 11, 2015

Comme vous l'avez probablement remarqué, si la variable n'est pas une chaîne, Django utilisera la méthode __str__ pour l'afficher; et avec le même principe, vous pouvez accéder à un attribut d'objet comme vous le faites en Python. Par exemple: si nous voulions afficher la date année, ma variable serait: {{today.year}}.

Filtres

Ils vous aident à modifier les variables au moment de l'affichage. La structure des filtres ressemble à ce qui suit: {{var | filters}}.

Some examples -

  • {{string|truncatewords:80}} - Ce filtre tronquera la chaîne, vous ne verrez donc que les 80 premiers mots.

  • {{string|lower}} - Convertit la chaîne en minuscules.

  • {{string|escape|linebreaks}} - Échappe le contenu de la chaîne, puis convertit les sauts de ligne en balises.

Vous pouvez également définir la valeur par défaut d'une variable.

Mots clés

Les balises vous permettent d'effectuer les opérations suivantes: condition if, boucle for, héritage de modèle, etc.

Marquer si

Tout comme en Python, vous pouvez utiliser if, else et elif dans votre modèle -

<html>
   <body>
   
      Hello World!!!<p>Today is {{today}}</p>
      We are
      {% if today.day == 1 %}
      
      the first day of month.
      {% elif today.day == 30 %}
      
      the last day of month.
      {% else %}
      
      I don't know.
      {%endif%}
      
   </body>
</html>

Dans ce nouveau modèle, en fonction de la date du jour, le modèle rendra une certaine valeur.

Tag pour

Tout comme 'if', nous avons la balise 'for', qui fonctionne exactement comme en Python. Changeons notre point de vue bonjour pour transmettre une liste à notre modèle -

def hello(request):
   today = datetime.datetime.now().date()
   
   daysOfWeek = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
   return render(request, "hello.html", {"today" : today, "days_of_week" : daysOfWeek})

Le modèle pour afficher cette liste avec {{for}} -

<html>
   <body>
      
      Hello World!!!<p>Today is {{today}}</p>
      We are
      {% if today.day == 1 %}
      
      the first day of month.
      {% elif today.day == 30 %}
      
      the last day of month.
      {% else %}
      
      I don't know.
      {%endif%}
      
      <p>
         {% for day in days_of_week %}
         {{day}}
      </p>
		
      {% endfor %}
      
   </body>
</html>

Et nous devrions obtenir quelque chose comme -

Hello World!!!
Today is Sept. 11, 2015
We are I don't know.
Mon
Tue
Wed
Thu
Fri
Sat
Sun

Bloquer et étendre les balises

Un système de modèles ne peut pas être complet sans héritage de modèles. Cela signifie que lorsque vous concevez vos modèles, vous devriez avoir un modèle principal avec des trous que le modèle de l'enfant remplira en fonction de ses propres besoins, comme une page pourrait avoir besoin d'un CSS spécial pour l'onglet sélectionné.

Modifions le modèle hello.html pour hériter d'un main_template.html.

main_template.html

<html>
   <head>
      
      <title>
         {% block title %}Page Title{% endblock %}
      </title>
      
   </head>
	
   <body>
   
      {% block content %}
         Body content
      {% endblock %}
      
   </body>
</html>

hello.html

{% extends "main_template.html" %}
{% block title %}My Hello Page{% endblock %}
{% block content %}

Hello World!!!<p>Today is {{today}}</p>
We are
{% if today.day == 1 %}

the first day of month.
{% elif today.day == 30 %}

the last day of month.
{% else %}

I don't know.
{%endif%}

<p>
   {% for day in days_of_week %}
   {{day}}
</p>

{% endfor %}
{% endblock %}

Dans l'exemple ci-dessus, en appelant / myapp / hello, nous obtiendrons toujours le même résultat qu'avant, mais maintenant nous comptons sur les extensions et les blocs pour refactoriser notre code -

Dans le main_template.html, nous définissons des blocs à l'aide du bloc de balises. Le cartouche contiendra le titre de la page et le bloc de contenu aura le contenu principal de la page. Dans home.html, nous utilisons des extensions pour hériter du main_template.html puis nous remplissons le bloc défini ci-dessus (contenu et titre).

Balise de commentaire

La balise de commentaire permet de définir les commentaires dans des modèles, pas dans des commentaires HTML, ils n'apparaîtront pas dans la page HTML. Cela peut être utile pour la documentation ou simplement pour commenter une ligne de code.