• 20 hours
  • Medium

Free online content available in this course.

course.header.alt.is_video

course.header.alt.is_certifying

Got it!

Last updated on 12/12/19

Déterminez les informations pertinentes à afficher

Log in or subscribe for free to enjoy all this course has to offer!

Les réservations apparaissent dans l'interface d'administration ! Youpi ! Dans ce chapitre vous ajouterez les autres tables et apprendrez comment spécifier l'affichage de certains champs.

Vous avez vu, dans le chapitre précédent, que la syntaxe suivante permettait d'activer un modèle dans l'administration :

admin.site.register(Booking)

Il existe une notation alternative utilisant les décorateurs. Les adorant, j'utiliserai celle-là pendant la suite de ce cours :

admin.py

from .models import Booking, Contact

@admin.register(Contact)
class ContactAdmin(admin.ModelAdmin):
    pass

Ajout des informations provenant d'une autre table

Relation un à un ou plusieurs à un

Regardez la page d'un contact. Elle n'affiche que les informations de sa propre table :

Je trouverais plus judicieux d'y visualiser également les informations liées, par exemple les réservations effectuées par ce contact. Elles devront s'afficher sous la forme d'une liste à plusieurs colonnes. Le module admin contient justement une classe spécialisée dans cet affichage : TabularInline.

Créez une nouvelle classe qui hérite de TabularInline :

class BookingInline(admin.TabularInline):
    model = Booking
    fieldsets = [
        (None, {'fields': ['album', 'contacted']})
        ] # list columns

@admin.register(Contact)
class ContactAdmin(admin.ModelAdmin):
    inlines = [BookingInline,] # list of bookings made by a contact

class BookingInline(admin.TabularInline):
    # ...
    extra = 0

Relation plusieurs à plusieurs

Une relation plusieurs à plusieurs suppose qu'une table additionnelle est utilisée. Si vous oubliez de l'indiquer, les informations n'apparaitront pas.

Créez une nouvelle classe pour afficher les albums d'un artiste :

from .models import Booking, Contact, Album, Artist

# ...

class AlbumArtistInline(admin.TabularInline):
    model = Album.artists.through # the query goes through an intermediate table.
    extra = 1


@admin.register(Artist)
class ArtistAdmin(admin.ModelAdmin):
    inlines = [AlbumArtistInline,]

Modification des noms par défaut

Django affiche les noms que vous avez donnés à vos modèles dans l'interface d'administration, par exemple "Booking" désigne actuellement une réservation. Dans le cas d'informations appartenant à des items liés, le titre est pire encore ! Je ne sais pas ce que vous en pensez, mais si je n'étais pas développeuse l'expression "RELATIONS ALBUM-ARTIST" ne me parlerait pas beaucoup... Or il apparaît dans la liste des albums d'un artiste.

Changeons tout cela en utilisant l'attribut de classe verbose_name :

class BookingInline(admin.TabularInline):
    verbose_name = "Réservation"
    verbose_name_plural = "Réservations"

# ...

class AlbumArtistInline(admin.TabularInline):
    verbose_name = "Disque"
    verbose_name_plural = "Disques"

Pour changer le nom représentant un modèle, modifiez directement ce dernier en utilisant la classe Meta :

models.py

class Artist(models.Model):
    # ...
    class Meta:
        verbose_name = "artiste"


class Contact(models.Model):
    # ...
    class Meta:
        verbose_name = "prospect"

class Album(models.Model):
    # ...
    class Meta:
        verbose_name = "disque"

class Booking(models.Model):
    # ...
    class Meta:
        verbose_name = "réservation"

Il est également possible de passer le nom d'un champ en paramètre, comme ceci :

class Album(models.Model):
    reference = models.IntegerField('référence', blank=True, null=True)

Prenez quelques instants pour traduire les champs, cela vous sera utile pour la suite !

Recherche facilitée parmi les données

L'interface d'administration de Django inclut également de nombreux outils de recherche dont des formulaires et des filtres.

Un formulaire sera appréciable pour trier des informations enregistrées en chaînes de caractères. Afin d'ajouter un formulaire de recherche dans un modèle, ajoutez simplement l'attribut de classe search_fields. Puis indiquez les champs dans lesquels effectuer la recherche.

Par exemple, le disquaire pourra chercher des albums par référence ou par titre si vous ajoutez ceci :

admin.py

@admin.register(Album)
class AlbumAdmin(admin.ModelAdmin):
    search_fields = ['reference', 'title']

Les filtres sont une autre possibilité. Ils permettent d'afficher des items en fonction de la valeur de certaines colonnes. Cela est très utile si vous travaillez avec des booléens par exemple !

Ajoutez deux filtres concernant les réservations :

  • réservations à traiter,

  • réservations envoyées le mois passé.

Voici comment faire :

admin.py

@admin.register(Booking)
class BookingAdmin(admin.ModelAdmin):
    list_filter = ['created_at', 'contacted']

Et voilà le résultat !

La configuration de l'interface d'administration est presque terminée ! Dans le prochain chapitre, découvrez comment indiquer que certains champs ne doivent pas être modifiés. A tout de suite !

Code de ce chapitre

Retrouvez l'intégralité du code sur ce dépôt GitHub.

Example of certificate of achievement
Example of certificate of achievement