====== 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'