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 présenter 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 pointant vers un livre, loan.book permet d’aller dans le sens direct, et Django ajoute à Book un gestionnaire pour le sens inverse, nommé d’après le modèle suivi de _set : book.loan_set.all(). related_name permet de lui donner un meilleur nom :
book = models.ForeignKey(Book, on_delete=models.PROTECT, related_name="loans")Maintenant, 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 : sur la page d’un livre, {% for loan in book.loans.all %} liste les prêts de ce livre. Un nom mal orthographié n’affiche rien, sans erreur ; si une liste est vide, vérifie d’abord les noms.
Défi
FacileAffiche les autres livres de l’auteur sur la page de chaque livre.
- Dans
books/models.py, donne àBook.authorle nom associébooks, afin queauthor.books.all()renvoie tous les livres de cet auteur. - Dans
book_detail.html, au-dessus du lien de retour, ajoute un<h2>commeMore by Frank Herbertet un<ul class="more">répertoriant tous les livres de cet auteur, chacun étant un lien vers sa page.
Appuie sur Run et clique sur Dune : sous More by Frank Herbert, tu vois Children of Dune et Dune.
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 %}
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
3Des pages issues de la base de données
Une liste issue de la base de donnéesUne page pour chaque livreEntraînez-vous par vous-même : Playground Django