Repository with sources and generator of https://larlet.fr/david/ https://larlet.fr/david/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

article.md 29KB

4 vuotta sitten
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  1. title: Rédaction de votre première appli Django, partie 2 : Exploration de l'interface d'admin auto-générée
  2. slug: redaction-de-votre-premiere-appli-django-partie-2-exploration-de-l-interface-d-admin-auto-generee
  3. date: 2006-06-17 19:29:01
  4. type: post
  5. vignette: images/logos/django.png
  6. contextual_title1: Le langage de template Django : Pour les auteurs de templates
  7. contextual_url1: 20060815-le-langage-de-template-django-pour-les-auteurs-de-templates
  8. contextual_title2: Comparaison de TurboGears et Django, deux frameworks web Python
  9. contextual_url2: 20060715-comparaison-de-turbogears-et-django-deux-frameworks-web-python
  10. contextual_title3: Rédaction de votre première appli Django, partie 4 : Conception d'un formulaire et vues génériques
  11. contextual_url3: 20060617-redaction-de-votre-premiere-appli-django-partie-4-conception-d-un-formulaire-et-vues-generiques
  12. <p>Ce tutoriel commence là où le <a class="reference" href="https://larlet.fr/david/biologeek/archives/20060617-redaction-de-votre-premiere-appli-django-partie-1-initialisation-creation-des-modeles-et-api-de-la-base-de-donnees/">Tutoriel 1</a> s'achève. Nous continuons
  13. l'application de sondage Web et allons nous focaliser sur le site
  14. d'administration généré automatiquement par Django.</p>
  15. <div class="section">
  16. <h1><a id="activer-le-site-d-admin" name="activer-le-site-d-admin">Activer le site d'admin</a></h1>
  17. <p>Le site d'admin de Django n'est pas activé par défaut -- c'est une
  18. fonctionnalité optionnelle. Pour activer le site d'admin dans votre
  19. installation, suivez ces trois points:</p>
  20. <blockquote>
  21. <ul class="simple">
  22. <li>Ajoutez <tt class="docutils literal"><span class="pre">&quot;django.contrib.admin&quot;</span></tt> dans votre option <tt class="docutils literal"><span class="pre">INSTALLED_APPS</span></tt>.</li>
  23. <li>Lancez <tt class="docutils literal"><span class="pre">python</span> <span class="pre">manage.py</span> <span class="pre">syncdb</span></tt>. Puisque vous avez ajouté une nouvelle
  24. application à <tt class="docutils literal"><span class="pre">INSTALLED_APPS</span></tt>, les tables de la base de données ont
  25. besoin d'être mises à jour.</li>
  26. <li>Éditez votre fichier <tt class="docutils literal"><span class="pre">monsite/urls.py</span></tt> et décommentez la ligne en
  27. dessous de « Uncomment this for admin: ». Ce fichier est une URLconf; nous
  28. creuserons le sujet des URLconfs dans le prochain tutoriel. Pour
  29. l'instant, tout ce que vous avez besoin de savoir est qu'il définit la
  30. racine des URLs de vos applications.</li>
  31. </ul>
  32. </blockquote>
  33. </div>
  34. <div class="section">
  35. <h1><a id="d-marrer-le-serveur-de-d-veloppement" name="d-marrer-le-serveur-de-d-veloppement">Démarrer le serveur de développement</a></h1>
  36. <p>Démarrons le serveur de développement et explorons le site d'administration.</p>
  37. <p>Rappel du Tutoriel 1 : vous démarrez le serveur de développement comme ceci:</p>
  38. <pre class="literal-block">
  39. python manage.py runserver
  40. </pre>
  41. <p>À présent, ouvrez un navigateur Web et allez au « /admin/ » de votre domaine
  42. local -- par exemple, <a class="reference" href="http://127.0.0.1:8000/admin/">http://127.0.0.1:8000/admin/</a>. Vous devriez voir l'écran de
  43. connexion à l'interface d'admin:</p>
  44. <img alt="L'écran de connexion à l'interface d'admin de Django" src="/static/david/biologeek/images/django/admin01.png" />
  45. </div>
  46. <div class="section">
  47. <h1><a id="entrez-dans-le-site-d-admin" name="entrez-dans-le-site-d-admin">Entrez dans le site d'admin</a></h1>
  48. <p>Maintenant, essayez de vous identifier (vous avez créé un compte
  49. superutilisateur dans la première partie du tutoriel vous vous rappelez ?).
  50. Vous devriez voir la page d'index de l'interface d'admin de Django:</p>
  51. <a class="reference image-reference" href="/static/david/biologeek/images/django/admin02.png"><img alt="La page d'index de l'interface d'admin de Django" src="/static/david/biologeek/images/django/admin02t.png" /></a>
  52. <p>Par défaut, vous deviez voir deux types de contenu éditable : groupes et
  53. utilisateurs.
  54. Ce sont des caractéristiques du noyau que Django intègre par défaut.</p>
  55. </div>
  56. <div class="section">
  57. <h1><a id="rendre-l-appli-de-sondage-modifiable-via-l-interface-d-admin" name="rendre-l-appli-de-sondage-modifiable-via-l-interface-d-admin">Rendre l'appli de sondage modifiable via l'interface d'admin</a></h1>
  58. <p>Mais où est notre appli de sondage ? Il n'est pas affiché sur la page d'index de
  59. l'interface d'admin.</p>
  60. <p>Juste une chose à faire : Nous avons besoin de spécifier dans le modèle <tt class="docutils literal"><span class="pre">Poll</span></tt>
  61. que les objets <tt class="docutils literal"><span class="pre">Poll</span></tt>
  62. ont une interface d'admin. Éditez le fichier <tt class="docutils literal"><span class="pre">monsite/polls/models.py</span></tt> et
  63. faites les modifications suivantes pour ajouter une classe interne <tt class="docutils literal"><span class="pre">Admin</span></tt>:</p>
  64. <pre class="literal-block">
  65. class Poll(models.Model):
  66. # ...
  67. class Admin:
  68. pass
  69. </pre>
  70. <p>La <tt class="docutils literal"><span class="pre">classe</span> <span class="pre">Admin</span></tt> contiendra les paramètres qui contrôle comment ce modèle
  71. apparaît dans l'interface d'admin de Django. Tous les paramètres sont
  72. optionnels, cependant, créer ainsi une classe vide signifie « donne une
  73. interface d'administration à cet objet en utilisant les options par défaut ».</p>
  74. <p>Maintenant rechargez la page d'admin de Django pour voir les changements. Notez
  75. que vous n'avez pas à redémarrer le serveur de développement -- le serveur
  76. auto-recharge votre projet, du coup toute modification dans le code peut être
  77. visualisé immédiatement dans votre navigateur.</p>
  78. </div>
  79. <div class="section">
  80. <h1><a id="explorer-les-fonctionnalit-s-libres-de-l-interface-d-admin" name="explorer-les-fonctionnalit-s-libres-de-l-interface-d-admin">Explorer les fonctionnalités libres de l'interface d'admin</a></h1>
  81. <p>Maintenant que <tt class="docutils literal"><span class="pre">Poll</span></tt> a sa classe interne <tt class="docutils literal"><span class="pre">Admin</span></tt>, Django sait qu'il devrait
  82. être affiché sur la page d'index du site d'admin:</p>
  83. <a class="reference image-reference" href="/static/david/biologeek/images/django/admin03.png"><img alt="La page d'index du site d'admin de Django, maintenant avec les sondages d'affichés" src="/static/david/biologeek/images/django/admin03t.png" /></a>
  84. <p>Cliquez sur « Polls ». À présent, vous êtes sur la page « de listage pour
  85. modification » des sondages. Cette page affiche tous les sondages de la base de
  86. données et vous permet d'en choisir un pour l'éditer.
  87. Il y a le sondage « Quoi de neuf ? » que nous avons créé dans le premier
  88. tutoriel:</p>
  89. <a class="reference image-reference" href="/static/david/biologeek/images/django/admin04.png"><img alt="La page de listage pour modification" src="/static/david/biologeek/images/django/admin04t.png" /></a>
  90. <p>Cliquez sur le sondage « Quoi de neuf ? » pour l'éditer :</p>
  91. <a class="reference image-reference" href="/static/david/biologeek/images/django/admin05.png"><img alt="Formulaire d'édition pour un objet sondage poll" src="/static/david/biologeek/images/django/admin05t.png" /></a>
  92. <p>Choses à noter ici:</p>
  93. <ul class="simple">
  94. <li>Le formulaire est généré automatiquement depuis le modèle Poll.</li>
  95. <li>Les différents types de champs du modèle (<tt class="docutils literal"><span class="pre">models.DateTimeField</span></tt>,
  96. <tt class="docutils literal"><span class="pre">models.CharField</span></tt>) correspondent au widget d'entrée HTML approprié. Chaque
  97. type de champ sait comment s'afficher dans l'interface d'admin de Django.</li>
  98. <li>Chaque <tt class="docutils literal"><span class="pre">DateTimeField</span></tt> reçoit des raccourcis Javascript libre. Les dates
  99. obtiennent un raccourci « Aujourd'hui » et un calendrier en popup, et les
  100. heures obtiennent un raccourci « Maintenant » et une popup pratique qui liste
  101. les heures couramment saisies.</li>
  102. </ul>
  103. <p>La partie inférieur de la page vous propose une série d'opérations:</p>
  104. <ul class="simple">
  105. <li>Sauver -- Sauvegarde les modifications et retourne à la page de listage pour
  106. modification pour ce type d'objet.</li>
  107. <li>Sauver et continuer les modifications -- Sauvegarde les modifications et
  108. recharge la page d'administration de cet objet.</li>
  109. <li>Sauver et ajouter un nouveau -- Sauvegarde les modifications et charge un
  110. nouveau formulaire vierge pour ce type d'objet.</li>
  111. <li>Supprimer -- Affiche la page de confirmation de la suppression.</li>
  112. </ul>
  113. <p>Changez la « Date de publication » en cliquant sur les raccourcis
  114. « Aujourd'hui » et « Maintenant ». Puis cliquez sur « Sauver et continuer les
  115. modifications ». Ensuite, cliquez sur « Historique » en haut à droite de la
  116. page. Vous verrez une page listant toutes les modifications effectuées sur cet
  117. objet via l'interface d'administration de Django, accompagnées des date et
  118. heure, ainsi que du nom de l'utilisateur qui a fait ce changement:</p>
  119. <a class="reference image-reference" href="/static/david/biologeek/images/django/admin06.png"><img alt="La page d'historique pour l'objet de sondage poll" src="/static/david/biologeek/images/django/admin06t.png" /></a>
  120. </div>
  121. <div class="section">
  122. <h1><a id="personnaliser-le-formulaire-d-administration" name="personnaliser-le-formulaire-d-administration">Personnaliser le formulaire d'administration</a></h1>
  123. <p>Prenez quelques minutes pour vous émerveiller devant le code que vous n'avez
  124. pas dû écrire.</p>
  125. <p>Personnalisons un peu tout ça. Nous pouvons réordonner les champs en ajoutant
  126. explicitement un paramètre <tt class="docutils literal"><span class="pre">fields</span></tt> à <tt class="docutils literal"><span class="pre">Admin</span></tt>:</p>
  127. <pre class="literal-block">
  128. class Admin:
  129. fields = (
  130. (None, {'fields': ('pub_date', 'question')}),
  131. )
  132. </pre>
  133. <p>Cela fait que la « Date de publication » apparaît en premier au lieu d'être en
  134. second:</p>
  135. <img alt="Les champs ont été réordonnés" src="/static/david/biologeek/images/django/admin07.png" />
  136. <p>Ce n'est pas spécialement impressionnant avec seulement deux champs, mais pour
  137. un formulaire d'administration avec des douzaines de champs, choisir un ordre
  138. intuitif est un détail d'utilisation important.</p>
  139. <p>Et en parlant de formulaires avec des douzaines de champs, vous voudriez
  140. sûrement séparer le formulaire en plusieurs sous-ensembles:</p>
  141. <pre class="literal-block">
  142. class Admin:
  143. fields = (
  144. (None, {'fields': ('question',)}),
  145. ('Informations calendaires', {'fields': ('pub_date',)}),
  146. )
  147. </pre>
  148. <p>Le premier élément de chaque tuple dans <tt class="docutils literal"><span class="pre">fields</span></tt> est le titre de la
  149. sous-partie. Voici ce à quoi notre formulaire ressemble à présent:</p>
  150. <a class="reference image-reference" href="/static/david/biologeek/images/django/admin08.png"><img alt="Le formulaire a des sous-sensembles de champs à présent" src="/static/david/biologeek/images/django/admin08t.png" /></a>
  151. <p>Vous pouvez assigner des classes HTML arbitraires à chaque sous-ensemble. Django
  152. fournit une classe <tt class="docutils literal"><span class="pre">&quot;collapse&quot;</span></tt> qui affiche un sous-ensemble particulier,
  153. initialement replié. C'est une fonctionnalité utile lorsque vous avez un long
  154. formulaire qui contient un certain nombre de champs qui ne sont pas couramment
  155. utilisés:</p>
  156. <pre class="literal-block">
  157. class Admin:
  158. fields = (
  159. (None, {'fields': ('question',)}),
  160. ('Informations calendaires', {'fields': ('pub_date',), 'classes': 'collapse'}),
  161. )
  162. </pre>
  163. <img alt="Le sous-ensemble est initialement replié" src="/static/david/biologeek/images/django/admin09.png" />
  164. </div>
  165. <div class="section">
  166. <h1><a id="ajout-d-objets-li-s" name="ajout-d-objets-li-s">Ajout d'objets liés</a></h1>
  167. <p>OK, nous avons notre page d'administration de sondages Poll. Mais un sondage
  168. <tt class="docutils literal"><span class="pre">Poll</span></tt> possède plusieurs choix <tt class="docutils literal"><span class="pre">Choices</span></tt>, et la page d'admin n'affiche aucun
  169. choix.</p>
  170. <p>Pour le moment.</p>
  171. <p>Il y a deux façon de résoudre ce problème. Le premier et de donner au modèle
  172. <tt class="docutils literal"><span class="pre">Choice</span></tt> sa propre classe interne <tt class="docutils literal"><span class="pre">Admin</span></tt>, tout comme nous l'avons fait pour
  173. <tt class="docutils literal"><span class="pre">Poll</span></tt>. Voici ce que ça donnerait:</p>
  174. <pre class="literal-block">
  175. class Choice(models.Model):
  176. # ...
  177. class Admin:
  178. pass
  179. </pre>
  180. <p>Maintenant les choix sont une option disponible dans l'interface d'admin de
  181. Django. Le formulaire « Add choice » ressemble à ceci:</p>
  182. <img alt="Page d'administration de Choice" src="/static/david/biologeek/images/django/admin10.png" />
  183. <p>Dans ce formulaire, le champ « Poll » est une boîte de sélection contenant tous
  184. les sondages de la base de données. Django sait qu'une instance de
  185. <tt class="docutils literal"><span class="pre">ForeignKey</span></tt> devrait être représentée dans l'interface d'admin par une boîte
  186. <tt class="docutils literal"><span class="pre">&lt;select&gt;</span></tt>. Dans notre cas, seul un sondage existe à ce point.</p>
  187. <p>Notez également le lien « Add another » à côté de « Poll ». Chaque objet avec
  188. une relation ForeignKey vers un autre reçoit ce lien gratuitement. Quand vous
  189. cliquez sur « Add another », vous obtiendrez une fenêtre en popup quand le
  190. formulaire « Add poll ». Si vous ajoutez un sondage dans cette fenêtre et que
  191. vous cliquez sur « Sauver », Django sauvegardera le sondage dans la base de
  192. données et l'ajoutera dynamiquement comme choix sélectionné dans le formulaire
  193. « Add choice » que vous étiez en train de remplir.</p>
  194. <p>Mais, franchement, c'est une manière inefficace d'ajouter des objets « Choice »
  195. dans le système. Ça serait mieux si vous pouviez ajouter un groupe de choix
  196. « Choices » directement lorsque vous créez l'objet « Poll ». Faisons de cette
  197. façon.</p>
  198. <p>Retirez la classe <tt class="docutils literal"><span class="pre">Admin</span></tt> du modèle Choice. Puis, éditez le champ
  199. <tt class="docutils literal"><span class="pre">ForeignKey(Poll)</span></tt> comme ceci:</p>
  200. <pre class="literal-block">
  201. poll = models.ForeignKey(Poll, edit_inline=models.STACKED, num_in_admin=3)
  202. </pre>
  203. <p>Ça dit à Django: « Les objets Choice sont édités dans la page d'administration
  204. de Poll. Par défaut, fournir assez de champs pour 3 choix ».</p>
  205. <p>Ensuite, modifiez les autres champs dans <tt class="docutils literal"><span class="pre">Choice</span></tt> pour les mettre à
  206. <tt class="docutils literal"><span class="pre">core=True</span></tt>:</p>
  207. <pre class="literal-block">
  208. choice = models.CharField(maxlength=200, core=True)
  209. votes = models.IntegerField(core=True)
  210. </pre>
  211. <p>Ça dit à Django: « Quand tu édites un Choice dans la page d'admin de Poll, les
  212. champs 'choice' et 'votes' sont requis. La présence d'au moins un d'eux signifie
  213. que l'ajout d'un nouvel objet Choice, et que la mise à blanc de tous ces champs
  214. signifie la suppression de cet objet Choice existant ».</p>
  215. <p>Charger la page « Add poll » pour voir à quoi ça ressemble:</p>
  216. <a class="reference image-reference" href="/static/david/biologeek/images/django/admin11.png"><img alt="La page d'ajout de sondage contient maintenant des choix" src="/static/david/biologeek/images/django/admin11t.png" /></a>
  217. <p>Ça marche comme ceci : Il y a trois compartiments pour les choix « Choices »
  218. liés -- comme spécifié par <tt class="docutils literal"><span class="pre">num_in_admin</span></tt> -- mais chaque fois que vous revenez
  219. sur la page « Changement » d'un objet déjà créé, vous obtenez un compartiment
  220. supplémentaire (cela signifie que vous n'avez pas mis en dur de limite sur le
  221. nomble d'objets liés qui peuvent être ajoutés). Si vous aviez voulu de la place
  222. pour trois choix « Choices » supplémentaire à chaque fois que vous modifiez le
  223. sondage, vous auriez utilisé <tt class="docutils literal"><span class="pre">num_extra_on_change=3</span></tt>.</p>
  224. <p>Un petit problème cependant. Ça prend beaucoup de place d'afficher tous les
  225. champs pour saisir les objets « Choice » liés. C'est pour cette raison que
  226. Django offre une alternative d'affichage en ligne des objets liés:</p>
  227. <pre class="literal-block">
  228. poll = models.ForeignKey(Poll, edit_inline=models.TABULAR, num_in_admin=3)
  229. </pre>
  230. <p>Avec ce <tt class="docutils literal"><span class="pre">edit_inline=models.TABULAR</span></tt> (au lieu de <tt class="docutils literal"><span class="pre">models.STACKED</span></tt>), les
  231. objets liés sont affichés dans un format plus compact, comme un tableau:</p>
  232. <img alt="La page d'ajout de sondage a maintenant des choix plus compacts" src="/static/david/biologeek/images/django/admin12.png" />
  233. </div>
  234. <div class="section">
  235. <h1><a id="personnaliser-la-liste-pour-modification-de-l-interface-d-admin" name="personnaliser-la-liste-pour-modification-de-l-interface-d-admin">Personnaliser la liste pour modification de l'interface d'admin</a></h1>
  236. <p>Maintenant que la page d'admin des sondage « Poll » a un bon look, arrangeons un
  237. peu la page de « listage pour modification » -- celle qui affiche tous les
  238. sondages du système.</p>
  239. <p>Voici à quoi ça ressemble à ce point:</p>
  240. <a class="reference image-reference" href="/static/david/biologeek/images/django/admin04.png"><img alt="La page de listage pour modification des sondages Poll" src="/static/david/biologeek/images/django/admin04t.png" /></a>
  241. <p>Par défaut, Django affiche le <tt class="docutils literal"><span class="pre">str()</span></tt> de chaque objet. Mais parfois, ça serait
  242. plus utile si nous pouvions afficher des champs individuels. Dans ce but,
  243. utilisez l'option <tt class="docutils literal"><span class="pre">list_display</span></tt>, qui est un tuple de nom de champs à
  244. afficher, en colonnes, sur la page de listage pour modification de l'objet:</p>
  245. <pre class="literal-block">
  246. class Poll(models.Model):
  247. # ...
  248. class Admin:
  249. # ...
  250. list_display = ('question', 'pub_date')
  251. </pre>
  252. <p>Juste pour la démonstration, incluons également la méthode perso
  253. <tt class="docutils literal"><span class="pre">was_published_today</span></tt> du Tutoriel 1:</p>
  254. <pre class="literal-block">
  255. list_display = ('question', 'pub_date', 'was_published_today')
  256. </pre>
  257. <p>À présent la page de listage pour modification des sondage ressemble à ceci:</p>
  258. <a class="reference image-reference" href="/static/david/biologeek/images/django/admin13.png"><img alt="La page de listage pour modification, mise à jour" src="/static/david/biologeek/images/django/admin13t.png" /></a>
  259. <p>Vous pouvez cliquer sur les en-têtes de colonne pour trier selon ces valeurs --
  260. sauf dans le cas de l'en-tête <tt class="docutils literal"><span class="pre">was_published_today</span></tt>, parce que le tri selon le
  261. résultat d'une méthode arbitraire n'est pas supporté. Notez aussi que l'en-tête
  262. de la colonne pour <tt class="docutils literal"><span class="pre">was_published_today</span></tt> est, par défaut, le nom de la méthode
  263. (avec les underscores remplacés par des espaces. Mais vous pouvez changer cela
  264. en donnant à cette méthode un attribut <tt class="docutils literal"><span class="pre">short_description</span></tt>:</p>
  265. <pre class="literal-block">
  266. def was_published_today(self):
  267. return self.pub_date.date() == datetime.date.today()
  268. was_published_today.short_description = u'Publié aujourd\'hui ?'
  269. </pre>
  270. <p>Ajoutons une nouvelle amélioration à la page de listage pour modification de
  271. sondages : des filtres. Ajoutez la ligne suivante à <tt class="docutils literal"><span class="pre">Poll.Admin</span></tt>:</p>
  272. <pre class="literal-block">
  273. list_filter = ['pub_date']
  274. </pre>
  275. <p>Cela ajoute une sidebar « Filter » qui permet aux gens de filtrer la liste pour
  276. modification selon le champ <tt class="docutils literal"><span class="pre">pub_date</span></tt>:</p>
  277. <a class="reference image-reference" href="/static/david/biologeek/images/django/admin14.png"><img alt="La page de listage pour modification de sondages, mise à jour" src="/static/david/biologeek/images/django/admin14t.png" /></a>
  278. <p>Le type de filtre affiché dépend du type de champs que vous êtes en train de
  279. filtrer. Parce que <tt class="docutils literal"><span class="pre">pub_date</span></tt> est un DateTimeField, Django sait donner les
  280. options de filtrage par défaut pour les DateTimeFields: « Toutes les dates »,
  281. « Aujourd'hui », « Les 7 derniers jours », « Ce mois-ci », « Cette année ».</p>
  282. <p>Ça a meilleure forme. Ajoutons une fonctionnalité de recherche:</p>
  283. <pre class="literal-block">
  284. search_fields = ['question']
  285. </pre>
  286. <p>Cela ajoute une boîte de recherche en haut de la liste pour modification. Quand
  287. quelqu'un saisit des termes de recherche, Django va rechercher dans le champ
  288. <tt class="docutils literal"><span class="pre">question</span></tt>. Vous pouvez indiquer autant de champs que vous le désirez -- bien
  289. qu'il utilise un requête <tt class="docutils literal"><span class="pre">LIKE</span></tt> derrière, restez raisonnable pour garder votre
  290. base de données performante.</p>
  291. <p>Enfin, parce que les objets « Poll » ont des dates, il serait pratique
  292. d'effectuer un classement par date. Ajoutez cette ligne:</p>
  293. <pre class="literal-block">
  294. date_hierarchy = 'pub_date'
  295. </pre>
  296. <p>Cela ajoute une navigation hiérarchique, par date, en haut de la page de listage
  297. pour modification. Au premier niveau, il affiche toutes les années disponibles.
  298. Puis il affine le classement en mois et, finalement, en jours.</p>
  299. <p>C'est maintenant le bon moment de notez que les listes pour modification vous
  300. laissent une grande liberté de pagination. Par défaut, 50 items sont affichés
  301. par page. La pagination de listes pour modification, les boîtes de recherche,
  302. les filtres, les hiérarchies calendaires et le tri selon l'en-tête de colonne,
  303. tout fonctionne ensemble comme vous pensez qu'ils le devraient.</p>
  304. </div>
  305. <div class="section">
  306. <h1><a id="personnaliser-l-apparence-de-l-interface-d-administration" name="personnaliser-l-apparence-de-l-interface-d-administration">Personnaliser l'apparence de l'interface d'administration</a></h1>
  307. <p>C'est clair, avoir « Django administration » et « example.com » en haut de
  308. chaque page d'administration est ridicule. C'est juste du texte de substitution.</p>
  309. <p>C'est facile à modifier en utilisant le système de template de Django. Le site
  310. d'administration de Django est fait en Django lui-même, et ses interfaces
  311. utilisent le système de template propre à Django. (Ça devient métaphysique !)</p>
  312. <p>Ouvrez votre fichier de configuration (<tt class="docutils literal"><span class="pre">monsite/settings.py</span></tt>, souvenez-vous)
  313. et examinez l'option <tt class="docutils literal"><span class="pre">TEMPLATE_DIRS</span></tt>. <tt class="docutils literal"><span class="pre">TEMPLATE_DIRS</span></tt> est un tuple de
  314. répertoires du système de fichiers pour vérifier d'où les templates Django sont
  315. chargées. C'est un chemin de recherche.</p>
  316. <p>Par défaut, <tt class="docutils literal"><span class="pre">TEMPLATE_DIRS</span></tt> est vide. Donc, ajoutons-lui une ligne pour dire à
  317. Django où nos templates sont situées:</p>
  318. <pre class="literal-block">
  319. TEMPLATE_DIRS = (
  320. &quot;/home/mestemplates&quot;, # Remplacez par votre propre répertoire.
  321. )
  322. </pre>
  323. <p>À présent, copiez la template <tt class="docutils literal"><span class="pre">admin/base_site.html</span></tt> depuis le répertoire par
  324. défaut des templates de l'interface d'admin de Django
  325. (<tt class="docutils literal"><span class="pre">django/contrib/admin/templates</span></tt>) vers un sous-répertoire <tt class="docutils literal"><span class="pre">admin</span></tt> se
  326. trouvant dans le répertoire que vous avez défini dans <tt class="docutils literal"><span class="pre">TEMPLATE_DIRS</span></tt>. Par
  327. exemple, si votre <tt class="docutils literal"><span class="pre">TEMPLATE_DIRS</span></tt> contient <tt class="docutils literal"><span class="pre">&quot;/home/mestemplates&quot;</span></tt>, comme
  328. ci-dessus, copiez <tt class="docutils literal"><span class="pre">django/contrib/admin/templates/admin/base_site.html</span></tt> vers
  329. <tt class="docutils literal"><span class="pre">/home/mytemplates/admin/base_site.html</span></tt>. N'oubliez pas de créer au préalable
  330. ce sous-répertoire <tt class="docutils literal"><span class="pre">admin</span></tt>.</p>
  331. <p>Ensuite, éditez simplement le fichier et remplacez le texte générique de Django
  332. par le nom et l'URL de votre propre site.</p>
  333. <p>Notez que tous les templates de l'interface d'admin par défaut de Django
  334. peuvent être remplacés. Pour remplacer un template, faites simplement la même
  335. chose qu'avec <tt class="docutils literal"><span class="pre">base_site.html</span></tt> -- copiez le depuis le répertoire par défaut
  336. dans votre répertoire personnel, et faites les modifications.</p>
  337. <p>Les lecteurs avisés pourront demander : Mais si <tt class="docutils literal"><span class="pre">TEMPLATE_DIRS</span></tt> était vide par
  338. défaut, comment Django trouvait-il les templates par défaut de l'interface
  339. d'admin ? La réponse est que, par défaut, Django regarde automatiquement dans un
  340. éventuel sous-répertoire <tt class="docutils literal"><span class="pre">templates/</span></tt> à l'intérieur de chaque paquetage
  341. d'appli, pour l'utiliser en dernier recours. Lisez la <a class="reference" href="http://www.djangoproject.com/documentation/templates_python/#loader-types">documentation sur les
  342. types de chargeur</a> pour des informations complètes.</p>
  343. </div>
  344. <div class="section">
  345. <h1><a id="personnaliser-la-page-d-index-de-l-interface-d-admin" name="personnaliser-la-page-d-index-de-l-interface-d-admin">Personnaliser la page d'index de l'interface d'admin</a></h1>
  346. <p>De la même manière, vous voudriez sûrement personnaliser l'apparence de la page
  347. d'index de l'interface d'admin de Django.</p>
  348. <p>Par défaut, il affiche toutes les applis disponibles, selon la configuration de
  349. votre <tt class="docutils literal"><span class="pre">INSTALLED_APPS</span></tt>. Mais l'ordre dans lequel il affiche les éléments est
  350. aléatoire, et vous voudriez peut-être faire des modifications significatives sur
  351. la mise en page. Après tout, la page d'index est probablement la page la plus
  352. importante du site d'administration, donc autant qu'elle soit facile à utiliser.</p>
  353. <p>Le template à personnaliser est <tt class="docutils literal"><span class="pre">admin/index.html</span></tt>. (Faites la même chose
  354. qu'avec <tt class="docutils literal"><span class="pre">admin/base_site.html</span></tt> dans la précédente section -- copiez le depuis
  355. le répertoire par défaut vers votre répertoire de templates personnels.)
  356. Éditez le fichier, et vous verrez qu'il est utilisé une balise de template
  357. appelé <tt class="docutils literal"><span class="pre">{%</span> <span class="pre">get_admin_app_list</span> <span class="pre">as</span> <span class="pre">app_list</span> <span class="pre">%}</span></tt>. C'est l'instruction magique qui
  358. retrouve chaque appli Django installée. Au lieu d'utiliser ça, vous pouvez
  359. écrire en dur les liens vers les pages d'administration spécifiques aux objets
  360. de la meilleure manière que vous pensez.</p>
  361. <p>Django offre un autre raccourci dans cette procédure. Lancez la commande
  362. <tt class="docutils literal"><span class="pre">python</span> <span class="pre">manage.py</span> <span class="pre">adminindex</span> <span class="pre">polls</span></tt> pour obtenir un extrait de code de
  363. template à inclure dans la template de la page d'index de l'interface d'admin.
  364. C'est un point de départ plutôt utile.</p>
  365. <p>Pour des détails complets au sujet de la personnalisation de l'apparence du site
  366. d'administration de Django de manière générale, lisez le <a class="reference" href="http://www.djangoproject.com/documentation/admin_css/">guide CSS de
  367. l'interface d'admin de Django</a>.</p>
  368. <p>Lorsque vous vous serez familiarisé avec le site d'administration, lisez la
  369. <a class="reference" href="https://larlet.fr/david/biologeek/archives/20060617-redaction-de-votre-premiere-appli-django-partie-3-creation-des-vues-de-l-interface-publique/">partie 3 de ce tutoriel</a> pour commencer à travailler avec les vues publiques
  370. du sondage.</p>
  371. <p>Vous pouvez maintenant retourner à la <a class="reference" href="https://larlet.fr/david/biologeek/archives/20060617-traduction-francaise-de-la-documentation-de-django-le-framework-web-python/">page d'accueil des traductions de la
  372. documentation de Django</a>.</p>
  373. <p>Cette traduction correspond à la révision 3589 (post 0.95).</p>
  374. </div>