====== L'interface d'administration de Django ====== ===== Activer l'interface d'administration ===== L'interface d'administration n'est pas active par défaut. - décommenter //django.contrib.admin// dans //INSTALLED_APPS// de //settings.py// - [[tout_sur_django#synchroniser_la_base_de_donnees_construction_des_tables|synchroniser la base]] - décommenter les lignes d'admin de urls.py from django.contrib import admin admin.autodiscover() url(r'^admin/', include(admin.site.urls)), ===== Ajouter une application ===== Ajouter une application à l'interface d'administration. Permet de dire à l'interface d'administration du projet que nos objets ont une interface d'administration. * Dans monApplication/admin.py, ajouter from django.contrib import admin //... from monApplication.models import monApplication.monObjet * redémarrer le serveur : les modifications sont prises en compte automatiquement sans nécessiter de redémarrage mais pas les créations. ===== Ajouter un objet ===== Utiliser soit la méthode décrite ci-dessus soit en déclarant que l'administration d'un objet est réalisée au travers d'un autre objet. Pour un objet Enfant qui a une relation avec Parent from django.contrib import admin from polls.models import Enfant, Parent class EnfantInline(admin.StackedInline): model = Enfant extra = 3 class ParentAdmin(admin.ModelAdmin): fieldsets = [ ('Tests', {'fields': ['champ1', 'champ2'], 'classes': ['collapse']}), ] inlines = [EnfantInline] admin.site.register(Poll, PollAdmin) Utiliser //admin.TabularInline// pour un affichage en ligne ===== Personnaliser l'interface ===== ==== Personnaliser l'ordre d'apparition des champs ==== * Dans //admin.py// de l'application, créer une nouvelle classe qui définit l'ordre d'apparition des champs class MonApplicationAdmin(admin.ModelAdmin): fields = ['maVariable2', 'maVariable1'] * Passer cette classe comme second argument de la méthode d'enregistrement admin.site.register(MonApplication, MonApplicationAdmin) ==== Personnaliser l'intitulé des champs ==== S'appuie sur le [[django:models#affichage_d_un_intitule_de_champ_personnalise|verbose name]]. Pour les champs de type //ForeignKey//, //ManyToManyField// et //OneToOneField//, le verbose name doit être explicitement déclaré, le premier argument étant réservé au nom de la classe en relation. ==== Organiser les champs dans des groupes ==== * Dans la classe MonApplicationAdmin, ajouter les groupes class MonApplicationAdmin(admin.ModelAdmin): fieldsets = [ ('NomGroupe 1', {'fields': ['maVariable1', 'maVariable3']}), ('NomGroupe 1 2', {'fields': ['maVariable2']}), ] ==== Ajouter une classe personnalisée à un groupe de champs ==== class MonApplicationAdmin(admin.ModelAdmin): fieldsets = [ ('NomGroupe 1', {'fields': ['maVariable1', 'maVariable3'], 'classes': ['collapse']}), ('NomGroupe 1 2', {'fields': ['maVariable2']}), ] //collapse// est une classe livrée avec Django qui permet de réduire ou étendre un groupe de données. ==== Personnaliser l'affichage d'un objet ==== class MonApplicationAdmin(admin.ModelAdmin): fieldsets = [ ('NomGroupe 1', {'fields': ['maVariable1', 'maVariable3'], 'classes': ['collapse']}), ('NomGroupe 1 2', {'fields': ['maVariable2']}), ] list_display = ('maVariable1', 'maVariable2', 'maVariable3') Les méthodes de la classe peuvent également être utilisée. Dans ce cas, le tri sur la colonne correspondante n'est pas possible. Exemple avec une méthode vraiOuFaux() : class MonApplicationAdmin(admin.ModelAdmin): fieldsets = [ ('NomGroupe 1', {'fields': ['maVariable1', 'maVariable3'], 'classes': ['collapse']}), ('NomGroupe 1 2', {'fields': ['maVariable2']}), ] list_display = ('maVariable1', 'maVariable2', 'maVariable3', 'vraiOuFaux') Voir également [[django:models#personnaliser_l_affichage_d_un_modele_dans_l_interface_d_admin|comment personnaliser l'affichage d'une méthode]] ==== Ajouter une boite de filtrage ==== list_filter = ['monChampDeFiltrage1','monChampDeFiltrage2'] ==== Ajouter un champ de recherche ==== search_fields = ['monChamp1', 'monChamp2'] Utilise sql //LIKE//. La raison est donc de mise pour éviter les problèmes de performance. ==== Ajouter un tri par date ==== Il faut évidemment disposer d'une variable de type //DateTimeField// date_hierarchy = 'maVariableDate'