.. _intro-tutorial02: ================================================== Écrire votre première application Django, partie 2 ================================================== Ce tutoriel commence là où le :ref:`Tutoriel 1 ` s'achève. Nous continuons l'application de sondage Web et allons nous focaliser sur le site d'administration généré automatiquement par Django. .. admonition:: Philosophie La génération de sites d'admin pour votre équipe ou vos clients pour ajouter, modifier et suprimer du contenu est un travail pénible qui ne requiert pas beaucoup de créativité. C'est pour cette raison que Django automatise entièrement la création des interfaces d'administration des modèles. Django a été écrit dans un environnement éditorial, avec une très nette séparation entre les « éditeurs de contenu » et le site « public ». Les gestionnaires du site utilisent le système pour ajouter des nouvelles, des histoires, des événements, des résultats sportifs, etc., et ce contenu est affiché sur le site public. Django résoud le problème de création d'une interface uniforme pour les administrateurs du site qui éditent le contenu. L'interface d'admin n'est pas nécessairement destinée a être utilisée par les visiteurs du site ; c'est pour les gestionnaires du site. Activer le site d'admin ======================= Le site d'admin de Django n'est pas activé par défaut -- c'est une fonctionnalité optionnelle. Pour activer le site d'admin dans votre installation, suivez ces trois points: * Ajoutez ``"django.contrib.admin"`` dans votre option ``INSTALLED_APPS``. * Lancez ``python manage.py syncdb``. Puisque vous avez ajouté une nouvelle application à ``INSTALLED_APPS``, les tables de la base de données ont besoin d'être mises à jour. * Éditez votre fichier ``monsite/urls.py`` et décommentez la ligne en dessous de « Uncomment the next two lines... ». Ce fichier est une URLconf; nous creuserons le sujet des URLconfs dans le prochain tutoriel. Pour l'instant, tout ce que vous avez besoin de savoir est qu'il définit la racine des URLs de vos applications. A la fin, vous devriez avoir un fichier ``urls.py`` qui ressemble à ceci : .. parsed-literal:: from django.conf.urls.defaults import * # Uncomment the next two lines to enable the admin: **from django.contrib import admin** **admin.autodiscover()** urlpatterns = patterns('', # Example: # (r'^mysite/', include('mysite.foo.urls')), # Uncomment the admin/doc line below and add 'django.contrib.admindocs' # to INSTALLED_APPS to enable admin documentation: # (r'^admin/doc/', include('django.contrib.admindocs.urls')), # Uncomment the next line to enable the admin: **(r'^admin/(.*)', admin.site.root),** ) (Les lignes en gras sont celles qui doivent être décommentées.) Démarrer le serveur de développement ==================================== Démarrons le serveur de développement et explorons le site d'administration. Rappel du Tutoriel 1 : vous démarrez le serveur de développement comme ceci:: python manage.py runserver À présent, ouvrez un navigateur Web et allez au « /admin/ » de votre domaine local -- par exemple, http://127.0.0.1:8000/admin/. Vous devriez voir l'écran de connexion à l'interface d'admin: .. image:: ../_images/intro/admin01.png :alt: L'écran de connexion à l'interface d'admin de Django Entrez dans le site d'admin =========================== Maintenant, essayez de vous identifier (vous avez créé un compte superutilisateur dans la première partie du tutoriel vous vous rappelez ? Si vous n'en avez pas créé ou que vous avez oublié le mot de passe vous pouvez en `créer un nouveau`_ - en). Vous devriez voir la page d'index de l'interface d'admin de Django: .. _créer un nouveau: http://docs.djangoproject.com/en/dev/topics/auth/#topics-auth-creating-superusers .. image:: ../_images/intro/admin02t.png :alt: La page d'index de l'interface d'admin de Django Par défaut, vous devriez voir deux types de contenu éditable : groupes et utilisateurs. Ce sont des caractéristiques du noyau que Django intègre par défaut. Rendre l'appli de sondage modifiable via l'interface d'admin ============================================================ Mais où est notre appli de sondage ? Il n'est pas affiché sur la page d'index de l'interface d'admin. Juste une chose à faire : Nous avons besoin de spécifier dans le modèle ``Poll`` que les objets ``Poll`` ont une interface d'admin. Pour faire ceci, créez un fichier ``admin.py`` dans votre répertoire ``polls``, et éditez-le de la manière suivante : .. parsed-literal:: from mysite.polls.models import Poll from django.contrib import admin admin.site.register(Poll) Vous aurez besoin de redémarrer le serveur de développement pour voir vos changements. Normalement, le serveur redémarre automatiquement à chaque fois que vous modifiez un fichier, mais la création d'un nouveau fichier ne déclenche pas ce redémarrage. Explorer les fonctionnalités libres de l'interface d'admin ========================================================== Maintenant que nous avons inscrit ``Poll`` dans l'interface d'admin, Django sait qu'il devrait être affiché sur la page d'index: .. image:: ../_images/intro/admin03t.png :alt: La page d'index du site d'admin de Django, maintenant avec les sondages d'affichés Cliquez sur « Polls ». À présent, vous êtes sur la page « liste » des sondages. Cette page affiche tous les sondages de la base de données et vous permet d'en choisir un pour l'éditer. Il y a le sondage « Quoi de neuf ? » que nous avons créé dans le premier tutoriel: .. image:: ../_images/intro/admin04t.png :alt: La page de listage pour modification Cliquez sur le sondage « Quoi de neuf ? » pour l'éditer : .. image:: ../_images/intro/admin05t.png :alt: Formulaire d'édition pour un objet sondage poll A noter ici: * Le formulaire est généré automatiquement depuis le modèle Poll. * Les différents types de champs du modèle (``models.DateTimeField``, ``models.CharField``) correspondent au widget d'entrée HTML approprié. Chaque type de champ sait comment s'afficher dans l'interface d'admin de Django. * Chaque ``DateTimeField`` reçoit des raccourcis Javascript libres. Les dates obtiennent un raccourci « Aujourd'hui » et un calendrier en popup, et les heures obtiennent un raccourci « Maintenant » et une popup pratique qui liste les heures couramment saisies. La partie inférieure de la page vous propose une série d'opérations: * Sauver -- Sauvegarde les modifications et retourne à la page de listage pour modification pour ce type d'objet. * Sauver et continuer les modifications -- Sauvegarde les modifications et recharge la page d'administration de cet objet. * Sauver et ajouter un nouveau -- Sauvegarde les modifications et charge un nouveau formulaire vierge pour ce type d'objet. * Supprimer -- Affiche la page de confirmation de la suppression. Changez la « Date de publication » en cliquant sur les raccourcis « Aujourd'hui » et « Maintenant ». Puis cliquez sur « Sauver et continuer les modifications ». Ensuite, cliquez sur « Historique » en haut à droite de la page. Vous verrez une page listant toutes les modifications effectuées sur cet objet via l'interface d'administration de Django, accompagnées des date et heure, ainsi que du nom de l'utilisateur qui a fait ce changement: .. image:: ../_images/intro/admin06t.png :alt: La page d'historique pour l'objet de sondage poll Personnaliser le formulaire d'administration ============================================ Prenez quelques minutes pour vous émerveiller devant le code que vous n'avez pas dû écrire. Quand vous appelez ``admin.site.register(Poll)``, Django "devine" comment l'afficher dans l'interface d'administration. Souvent vous voudrez controller le look et le fonctionnement de l'interface; vous ferez ceci en communiquant à Django les options lors de l'inscription de l'objet. Voyons voir comment cela fonctionne, en réordonnant les champs sur le formulaire d'édition. Remplacez la ligne ``admin.site.register(Poll)`` avec:: class PollAdmin(admin.ModelAdmin): fields = ['pub_date', 'question'] admin.site.register(Poll, PollAdmin) Vous suivrez cette méthode -- c'est à dire, créer un objet d'administration de modèle, puis le passer en tant que deuxième paramètre de ``admin.site.register()`` -- à chaque fois que vous aurez besoin de changer les options d'administration pour un objet. Cela fait que la « Date de publication » apparaît en premier au lieu d'être en second: .. image:: ../_images/intro/admin07.png :alt: Les champs ont été réordonnés Ce n'est pas spécialement impressionnant avec seulement deux champs, mais pour un formulaire d'administration avec des douzaines de champs, choisir un ordre intuitif est un détail d'utilisation important. Et en parlant de formulaires avec des douzaines de champs, vous voudriez sûrement séparer le formulaire en plusieurs sous-ensembles:: class PollAdmin(admin.ModelAdmin): fieldsets = [ (None, {'fields': ['question']}), ('Date information', {'fields': ['pub_date']}), ] admin.site.register(Poll, PollAdmin) Le premier élément de chaque tuple dans ``fields`` est le titre de la sous-partie. Voici ce à quoi notre formulaire ressemble à présent: .. image:: ../_images/intro/admin08t.png :alt: Le formulaire a des sous-sensembles de champs à présent Vous pouvez assigner des classes HTML arbitraires à chaque sous-ensemble. Django fournit une classe ``"collapse"`` qui affiche un sous-ensemble particulier, initialement replié. C'est une fonctionnalité utile lorsque vous avez un long formulaire qui contient un certain nombre de champs qui ne sont pas couramment utilisés:: class PollAdmin(admin.ModelAdmin): fieldsets = [ (None, {'fields': ['question']}), ('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}), ] .. image:: ../_images/intro/admin09.png :alt: Le sous-ensemble est initialement replié Ajout d'objets liés =================== OK, nous avons notre page d'administration de sondages Poll. Mais un sondage ``Poll`` possède plusieurs choix ``Choices``, et la page d'admin n'affiche aucun choix. Pour le moment. Il y a deux façon de résoudre ce problème. Le premier et de donner au modèle ``Choice`` sa propre classe interne ``Admin``, tout comme nous l'avons fait pour ``Poll``. Voici ce que ça donnerait:: from mysite.polls.models import Choice admin.site.register(Choice) Maintenant les choix sont une option disponible dans l'interface d'admin de Django. Le formulaire « Add choice » ressemble à ceci: .. image:: ../_images/intro/admin10.png :alt: Page d'administration de Choice Dans ce formulaire, le champ « Poll » est une boîte de sélection contenant tous les sondages de la base de données. Django sait qu'une instance de ``ForeignKey`` devrait être représentée dans l'interface d'admin par une boîte ``