Nomes relacionados
Parte da seção Models e o Admin do Journey de Django da Coddy. Lição 17 de 23.
A página de um livro poderia listar os outros livros do autor. Isso significa ir do autor de volta aos livros dele: uma ForeignKey funciona nas duas direções. Com um Loan apontando para um livro, loan.book segue na direção direta, e o Django adiciona um gerenciador a Book para a direção inversa, com um nome formado pelo nome do modelo mais _set: book.loan_set.all(). related_name dá a ele um nome melhor:
book = models.ForeignKey(Book, on_delete=models.PROTECT, related_name="loans")Agora book.loans.all() retorna os empréstimos daquele livro, book.loans.count() funciona como em Loan.objects, e loan_set não existe mais.
Os templates seguem as relações com pontos e chamam métodos sem parênteses: na página de um livro, {% for loan in book.loans.all %} lista os empréstimos daquele livro. Um nome escrito incorretamente não mostra nada, sem gerar erro; portanto, quando uma lista aparece vazia, confira primeiro os nomes.
Desafio
FácilListe os outros livros do autor na página de cada livro.
- Em
books/models.py, atribua aBook.authoro nome relacionadobooks, para queauthor.books.all()retorne todos os livros desse autor. - Em
book_detail.html, acima do link Voltar, adicione um<h2>comoMore by Frank Herberte um<ul class="more">listando todos os livros desse autor, cada um como um link para sua página.
Pressione Executar e clique em Dune: abaixo de More by Frank Herbert, você verá Children of Dune e Dune.
Experimente você mesmo
{% 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 %}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.
Todas as lições de Models e o Admin
Pratique por conta própria: Playground de Django