1. Livres & vidéos
  2. Django
  3. Notions avancées sur les vues
Extrait - Django Concevez vos applications web professionnelles en Python : du modèle de données au déploiement
Extraits du livre
Django Concevez vos applications web professionnelles en Python : du modèle de données au déploiement Revenir à la page d'achat du livre

Notions avancées sur les vues

Intégration de Bootstrap 5

Pour visualiser le code relatif à ce chapitre : git diff v1.8.6..v1.9.0.

1. Installer Bootstrap 5 et les icônes

Pour commencer, nous allons installer deux modules qui automatisent une partie du travail : django-bootstrap5 et django-bootstrap-icons.

La première technique impose de démarrer une console, puis taper la commande :

$ make bash 
$ poetry add django-bootstrap5  django-bootstrap-icons  

Normalement, le fichier pyproject.toml ainsi que le fichier poetry.lock sont tous deux mis à jour.

La seconde technique consiste à rajouter directement les deux lignes suivantes dans pyproject.toml  :

django-bootstrap5 = "^25.2" 
django-bootstrap-icons = "^0.9.0"  

Puis, il faut utiliser la commande suivante pour générer un fichier poetry.lock cohérent avec ce dernier :

$ make lock  

Une fois ceci fait, quelle que soit la méthode, il faut reconstruire le conteneur :

$ make build  

Il faut maintenant configurer ces deux modules simplement en allant modifier le fichier project/settings.py :

INSTALLED_APPS = [ 
    ... 
    'jazzmin', 
    'django_bootstrap5', 
    'django_bootstrap_icons', 
... 
]  

Nous prendrons soin de les placer sous jazzmin afin que ce dernier conserve la précédence en cas de conflit.

2. Gabarit maître

Nous allons maintenant adapter nos vues pour utiliser la bibliothèque que nous venons d’installer, en commençant par le gabarit maître :

{# Load the tag library #} 
{% load django_bootstrap5 i18n %} 
<!DOCTYPE html> 
<html lang="fr"> 
    <head> 
        <meta charset="UTF-8"> 
        <title>{{ page_title }}</title> 
        {# Load CSS and JavaScript #} 
        {% bootstrap_css %} 
        {% bootstrap_javascript %} 
    </head> 
    <body> ...

Listes dynamiques

Pour visualiser le code relatif à ce chapitre : git diff v1.9.0..v1.9.1.

1. Installer un outil

Il existe plusieurs outils pour intégrer datatables.net à Django. Le plus récent et celui qui semble le plus à jour est : django-datatable-view.

Pour l’installer, soit il faut démarrer une console, puis taper la commande :

$ make bash 
$ poetry add django-datatable-view  

Cela mettra à jour à la fois le fichier pyproject.toml et le fichier poetry.lock.

Il est également possible d’ajouter directement la ligne suivante dans pyproject.toml :

django-datatable-view = "^2.1.6"  

Puis, dans un second temps, il faut utiliser la commande suivante pour générer un fichier poetry.lock cohérent avec ce dernier :

$ make lock  

Une fois ceci fait, recréer le conteneur :

$ make build  

Puis rajouter ceci au fichier settings.py :

INSTALLED_APPS = [ 
    ... 
    'datatableview', 
    ... 
]  

Et la configuration est terminée.

2. Création de la vue

La vue en question se paramètre exactement comme une vue classique, avec les mêmes attributs et les mêmes surcharges.

La voici :

from datatableview.views import DatatableView 
  
from .models import Genre 
  
  
class GenreDatatableView(DatatableView): 
    queryset = Genre.objects.all()  

Cette vue reste...

Éditeur avancé

Pour visualiser le code relatif à ce chapitre : git diff v1.9.1..v1.9.2.

1. Installer le module externe

Pour commencer, nous allons installer ce module externe : martor.

Nous pouvons démarrer une console, puis saisir la commande :

$ make bash 
$ poetry add martor  

Cette commande modifie en conséquence les fichiers pyproject.toml et poetry.lock. 

Nous pouvons également ajouter directement la ligne suivante dans pyproject.toml :

martor = "^1.7.15"  

Puis, générer un fichier poetry.lock cohérent avec ce dernier avec cette commande :

$ make lock  

Dans les deux cas, il faut reconstruire le conteneur :

$ make build  

Il faut maintenant configurer le fichier project/settings.py en ajoutant ceci :

INSTALLED_APPS = [ 
    ... 
    'martor', 
    ... 
]  

Ainsi que le fichier project/urls.py :

urlpatterns = [ 
     ... 
    path('martor/', include('martor.urls')), 
]  

2. Utiliser le champ dans un modèle

Dans le modèle jeu, nous allons rajouter un champ description :

from martor.models import MartorField 
  
  
class Game(TrackingMixin, models.Model): 
    … 
    description = MartorField( 
        verbose_name=gettext("description"), 
    ) 
    …  

Il faut ensuite penser à générer la migration, l’appliquer et vérifier que tout va bien.

Cela peut se faire par la requête suivante :

$ make update  

Au passage, cette requête va également collecter les fichiers statiques, ce qu’il fallait faire après l’installation du projet.

Nous pouvons maintenant sauvegarder les données afin d’ajouter le nouveau champ aux fichiers JSON :

$ make...

Template tags

Pour visualiser le code relatif à ce chapitre : git diff v1.9.2..v1.9.3.

1. Créer un tag simple

Dans la documentation de Django, il y a un certain nombre d’exemples permettant de créer un tag simple. Le nôtre utilisera la même syntaxe, mais aura aussi quelques difficultés supplémentaires.

Pour créer un template tag, il suffit de créer un package Python nommé templatetags, c’est-à-dire un répertoire contenant un fichier __init__.py, même vide.

Puis, il faut créer dans ce répertoire un nouveau module Python, c’est-à-dire un nouveau fichier nommé app_utils.py. Le nom est important, car il servira de référence lors du chargement dans le gabarit, afin de permettre l’utilisation de son contenu.

L’objectif est de supprimer le code HTML répétitif utilisé pour générer les icônes. Ce code est verbeux, favorise les copier-coller et augmente le risque d’erreurs ; il rend donc le projet plus difficile à maintenir.

Centraliser ce code à un seul endroit corrigera ces défauts.

Voici notre objectif, remplacer cela :

<a href="{% url 'game:list' %}" class="border">{% bs_icon 
'list-columns-reverse' %}</a> 
<a href="{% url 'game:create' %}" class="border">{% bs_icon 
'plus' %}</a> 
<a href="{% url 'game:detail' game.pk %}" 
class="border">{% bs_icon 'eye' %}</a> 
<a href="{% url 'game:update' game.pk %}" 
class="border">{% bs_icon 'pencil' %}</i></a> 
<a href="{% url 'game:delete' game.pk %}" 
class="border">{% bs_icon 'trash' %}</a>  

Par cela :

{% icon_action 'list' %} 
{% icon_action 'create' %} 
{% icon_action 'detail'...