Django : customiser les formulaires d’admin

On a vu dans un billet précédent comment créer les formulaires. On a aussi vu comment générer un panneau d’administration ultra rapidement avec Django. Maintenant, comment on customise les formulaires d’admin qui sont gracieusement générés pour simplifier votre vie de développeur débordé ?

La surcharge

Par défaut, il suffit de modifier le fichier admin.py de votre app, et d’ajouter par exemple admin.site.register(Question). Pour ça, on va supprimer cette ligne, et créer une classe, dans laquelle on va définir nos personnalisations. Puis, il faut enregistrer le modèle pour l’admin – comme la ligne qu’on vient de supprimer – mais en ajoutant un paramètre :


class QuestionAdmin(admin.ModelAdmin):
 fields = ['pub_date', 'question_text']

admin.site.register(Question, QuestionAdmin)

De cette manière, on a juste changé l’ordre des champs, rien de bien foufou, mais c’est pour l’exemple.

On peut aussi créer des groupements de champs, en jouant comme ça :

class QuestionAdmin(admin.ModelAdmin):
 fieldsets = [
 (None, {'fields': ['question_text']}),
 ('Date information', {'fields': ['pub_date']}),
 ]

Si vous avez un formulaire avec une bonne dizaine de champs, ça peut vous aider par exemple à sectionner les choses, par exemple en groupant les dates dans leur propre groupe, etc.

On a travaillé depuis quelques billets avec le couple Question/Choix, donc vous avez probablement déjà enregistré ce modèle dans l’admin. Mais comment rendre ces relations disponibles et lisibles depuis vos formulaires ? C’est ce qu’on va voir maintenant.

Jouer avec les relations

Alors Django est suffisamment intelligent pour deviner que quand il y a une relation, il doit la proposer dans le formulaire, sous forme d’un select. Il y a même un lien qui permet d’ajouter une entité question par exemple, directement depuis ce formulaire.

relations-plus

Mais c’est vrai que ce n’est pas très efficace. En fait, il serait plus simple, quand on veut créer une question, de directement pouvoir ajouter les choix non ?

Et bien ouvrez admin.py :

class ChoiceInline(admin.StackedInline):
model = Choice
extra = 3
class QuestionAdmin(admin.ModelAdmin):
fieldsets = [
(None, {'fields': ['question_text']}),
('Date information', {'fields': ['pub_date'], 'classes': ['collapse']}),
]
inlines = [ChoiceInline]

admin.site.register(Question, QuestionAdmin)

Et du coup, le formulaire d’ajout de question devient :

model-relations-django
C’est un aperçu rapide des modifications que vous pouvez faire, mais ça laisse une qualité de possibilités assez grande. Dans le prochain billet, on va voir comment changer l’apparence de l’admin, un truc essentiel non ?

metrogeek

Laisser un commentaire