Blog ENI : Toute la veille numérique !
Dernière chance (fin le 29/02) : -25€ dès 75€ sur les livres en ligne, vidéos... code FUSEE25. J'en profite !
Accès illimité 24h/24 à tous nos livres & vidéos ! 
Découvrez la Bibliothèque Numérique ENI. Cliquez ici
  1. Livres et vidéos
  2. Django
  3. L'administration de Django
Extrait - Django Industrialisez vos développements Python
Extraits du livre
Django Industrialisez vos développements Python Revenir à la page d'achat du livre

L'administration de Django

Introduction

L’administration de Django est un back office (outil de gestion des objets de votre site) à destination de ceux qui doivent gérer le site et en administrer le contenu.

La fonctionnalité la plus populaire de Django !

Un des composants les plus puissants de Django est certainement l’outil de génération automatique du site d’administration. C’est également ce qui rend Django populaire et qui séduit d’emblée la plupart des nouveaux utilisateurs. En effet, comment ne pas être séduit par le fait de disposer instantanément d’une interface d’administration sans quasiment avoir à écrire une ligne de code ! En effet, en programmation informatique et en particulier lors de la création d’applications web, un temps important doit être consacré à l’écriture d’une interface d’administration, partie du travail très répétitive, fastidieuse et qui présente peu d’intérêt. Django automatise cette tâche ingrate.

Nous en avons déjà parlé en introduction et dans le chapitre Pour débuter, notamment en ce qui concerne l’installation et le démarrage de l’Admin Django. Nous allons maintenant voir comment configurer en profondeur l’interface d’administration et décrire quelques fonctionnalités...

Activer et démarrer le site d’administration

Cette partie reprend ce que nous avons vu au chapitre Pour débuter.

Étape 1 :

Lors de la création d’un projet, le site d’administration est installé par défaut, mais il n’est pas nécessairement activé. Pour l’activer, éditez le fichier urls.py de votre projet et décommentez les lignes relatives à l’administration :


from django.conf.urls import patterns, include, url  
  
# Uncomment the next two lines to enable the admin:  
from django.contrib import admin  
admin.autodiscover()  
  
urlpatterns = patterns('',  
    # . . .  
    # Uncomment the admin/doc line below to enable admin 
documentation:  
    url(r'ˆadmin/doc/', include('django.contrib.admindocs.urls')), 
    # Uncomment the next line to enable the admin:  
    url(r'ˆadmin/', include(admin.site.urls)), 
) 
 

Puis faites de même dans le fichier settings.py de votre projet :


INSTALLED_APPS = (  
    # . . .  
    # Uncomment the next line to enable the admin:  
    'django.contrib.admin',  
    # Uncomment the next line to enable admin documentation:  
 ...

La configuration de votre site d’administration

Après ce rappel (rapide) sur la mise en œuvre du site d’administration, rentrons maintenant dans les détails.

Pour créer l’administration de nos modèles, nous avons donné nos modèles tels quels à Django qui a fait tout le travail.


from django.contrib import admin  
from monprojet.monapp.models import Article  
  
admin.site.register(Article) 
 

Cette commande est en fait rigoureusement identique au code suivant :


from django.contrib import admin  
from monprojet.monapp.models import Article  
  
class ArticleAdmin(admin.ModelAdmin):  
    pass  
admin.site.register(Article, ArticleAdmin)
 

Et donc à l’utilisation de la classe ModelAdmin.

Dans cet exemple, la différence entre le fait d’enregistrer directement un modèle et celui de passer par la classe ModelAdmin ne saute pas aux yeux. Pourtant, elle est primordiale, car c’est uniquement en dérivant cette classe que nous allons pouvoir personnaliser l’administration de Django.

Lorsque les écrans d’administration par défaut de Django conviennent, il n’y a pas lieu de s’intéresser aux caractéristiques de cette classe. Dans de nombreux cas et pour des modèles simples, on aura donc uniquement à écrire :


admin.site.register(MonModele)
 

1. Les objets ModelAdmin/la classe ModelAdmin

Mais si vous souhaitez personnaliser l’Admin, continuons les explications. Cette classe est extrêmement flexible dès qu’il s’agit de configurer l’interface d’administration. Pour cela il suffit de créer une classe dérivée de ModelAdmin et de renseigner certains attributs de la sous-classe. On va, dans la suite de ce chapitre, appeler ces attributs des options. Voyons comment elles se nomment et à quoi elles servent.

Comme il serait complexe de présenter un exemple unique illustrant l’utilisation de toutes les options de configuration, nous allons en faire l’inventaire, avec quelques exemples. Ces options sont très nombreuses et, de plus, vous utiliserez certaines options plus fréquemment que d’autres. C’est pour cela que certaines seront juste évoquées alors que d’autres seront expliquées...

Les actions d’administration

L’administration de Django fonctionne basiquement de la façon suivante : sélectionnez un modèle, puis sélectionnez un objet de ce modèle, enfin modifiez-le ou détruisez-le. Pour ce qui est de réaliser un travail de base, c’est amplement suffisant. Cependant on peut avoir besoin d’effectuer des tâches répétitives sur un ensemble d’objets, par exemple inscrire d’un seul coup 200 élèves à une unité de valeurs, etc. Pour faciliter ce genre de manipulation, Django vous permet d’écrire et d’enregistrer des actions. Ces actions sont des fonctions qui seront appelées avec la liste des objets sélectionnés sur l’écran d’affichage de la liste des objets. La seule action préinstallée par Django est « supprimer ».

1. Écrire vos propres actions

Le plus simple est encore de faire ensemble un exemple.

Présentons notre problème : à la fin de l’année pour l’examen de fin de chaque UV (unité de valeur), nous devons savoir si les étudiants sont présents, absents ou malades (excusés). Pour cela nous avons créé le modèle suivant :


from django.db import models  
  
ETAT_EXAMEN = (  
    ('a', 'Absent'),  
    ('p', 'Présent'),  
    ('x', 'Excusé'),  
)  
 
class Examen(models.Model):  
    titre = models.CharField(max_length=100)  
    uv = models.ForeignKey(UV)  
    etudiant = models.ForeignKey(Etudiant)  
    presence = models.CharField(max_length=1, choices= ETAT_EXAMEN, 
default='a')  
  
    def __unicode__(self):  # __str__ on Python 3  
        return self.titre + self.get_presence_display() 
 

Écrivons les fonctions réalisant l’action...

Le générateur automatique de documentation

Une fonctionnalité annexe de l’admin est le gestionnaire de documentation automatique. Bien qu’annexe, cette fonctionnalité est très intéressante.

Django va parcourir toutes les applications installées dans INSTALLED_APPS, et en extraire la documentation en inspectant les documentations (docstrings Python) des modèles, des vues et des tags/filtres de templates. Cela va non seulement concerner votre code, de façon à fabriquer rapidement une documentation claire, mais également le code de Django, vous donnant accès à la description de nombreuses fonctionnalités, notamment les tags et les filtres, directement sur votre site.

1. Installation

Prérequis

Le module Python docutils doit avoir été installé au préalable : http://docutils.sf.net/

Optionnelle, l’application django.contrib.admindocs.middleware.XView Middleware doit être installée pour pouvoir utiliser les « admindocs bookmarklets ».

Pour activer admindocs, ajoutez django.contrib.admindocs à INSTALLED_APPS dans votre fichier settings.py.

Ajoutez la ligne suivante (ou décommentez-la) dans le fichier urls.py racine :


    (r'ˆadmin/doc/', include('django.contrib.admindocs.urls'))
 

Positionnez-la avant la ligne contenant l’entrée r’ˆadmin/’, de façon à ce que les requêtes/admin/doc/ aillent dans la doc et pas dans l’admin....

Personnaliser les champs et les widgets de l’admin

Rien de très théorique dans cette section, mais plutôt un peu de pratique et deux exemples pour mettre en œuvre l’Admin sur des cas fréquents et que j’espère vous trouverez utiles.

Commençons d’abord par lister quelques widgets utilisés par l’Admin en fonction du type de champ.

Champ

Widget

HTML

Char/Email/URL/Field

TextInput

<input>

TextField

Textarea

<textarea>

IntegerField

NumberInput

<input>

FloatField

NumberInput

<input>

ForeignKey

Select

<select></select>

RadioSelect

<input type=« radio »>

« inlines »

N/a

ManyToManyField

SelectMultiple

<select></select>

JavaScript

N/a

« inlines »

N/a

choices=

Select

<select></select>

RadioSelect

<input type=« radio »>

Date & Time

Javascript

N/a

File/ImageFile/Field

FileInput

<input type="file">

Commençons par un problème simple, sachant qu’on a déjà évoqué ce problème lors de la section traitant de l’attribut formfield_overrides de la classe ModelField. On a dit que cet attribut était le plus souvent utilisé pour modifier le widget par défaut.

Nous avons installé un éditeur HTML pour éditer les zones de texte sur notre site, ici en l’occurrence ckeditor, et nous souhaitons pouvoir également l’utiliser dans l’Admin. 

C’est très simple...