Menu
CoddyTech

Noms associés

Fait partie de la section Modèles et interface d’administration du Journey Django de Coddy. Leçon 17 sur 23.

La page d’un livre pourrait répertorier les autres livres de son auteur. Cela signifie qu’on peut remonter de l’auteur à ses livres : une ForeignKey fonctionne dans les deux sens. Avec un Loan qui pointe vers un livre, loan.book permet d’aller dans un sens, et Django ajoute à Book un gestionnaire pour revenir en arrière, dont le nom est formé du nom du modèle suivi de _set : book.loan_set.all(). related_name permet de lui donner un nom plus parlant :

book = models.ForeignKey(Book, on_delete=models.PROTECT, related_name="loans")

Désormais, book.loans.all() renvoie les prêts de ce livre, book.loans.count() fonctionne comme avec Loan.objects, et loan_set n’existe plus.

Dans les modèles, on suit les relations avec des points et on appelle les méthodes sans parenthèses : {% for other in loan.book.loans.all %} permet d’avancer, puis de revenir à tous les prêts du même livre. Une faute de frappe dans un nom ne renvoie rien et ne déclenche aucune erreur ; si une liste est vide, vérifie d’abord les noms.

challenge icon

Défi

Facile
  • Attribuez à Book.author le nom de relation inverse books.
  • Dans book_detail.html, au-dessus du lien de retour, ajoutez un <h2> comme More by Frank Herbert et un <ul class="more"> répertoriant tous les livres de cet auteur, chacun étant un lien vers sa page.

Appuyez sur Run et ouvrez la page d’un livre.

Essayez vous-même

{% extends "books/base.html" %}

{% block title %}{{ book.title }}{% endblock %}

{% block content %}
<h1>{{ book.title }}</h1>
<p class="author">by {{ book.author }}</p>
<ul>
    <li>Published in {{ book.year }}</li>
    <li>Genre: {{ book.get_genre_display }}</li>
    <li>Price: {{ book.price }}</li>
</ul>
<p><a href="{% url 'books:home' %}">Back to the shelf</a></p>
{% endblock %}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Modèles et interface d’administration

Entraînez-vous par vous-même : Playground Django