Связанные имена
Часть раздела Модели и панель администратора путешествия по Django на Coddy. Урок 17 из 23.
На странице книги можно было бы перечислить другие книги автора. Это значит, что можно перейти от автора обратно к его книгам: ForeignKey работает в обоих направлениях. Если Loan указывает на книгу, то loan.book ведёт вперёд, а Django добавляет к Book менеджер для обратного направления, названный по модели с добавлением _set: book.loan_set.all(). related_name позволяет задать ему более подходящее имя:
book = models.ForeignKey(Book, on_delete=models.PROTECT, related_name="loans")Теперь book.loans.all() возвращает займы этой книги, book.loans.count() работает так же, как и для Loan.objects, а loan_set больше не существует.
В шаблонах для перехода по связям используют точки, а методы вызывают без скобок: на странице книги {% for loan in book.loans.all %} перечисляет займы этой книги. Если имя написано с ошибкой, ничего не отображается и ошибка не возникает, поэтому, если список пуст, сначала проверьте имена.
Задание
ЛегкоПеречислите другие книги автора на странице каждой книги.
- В
books/models.pyзадайте дляBook.authorсвязанное имяbooks, чтобыauthor.books.all()возвращал все книги этого автора. - В
book_detail.html, над ссылкой «Назад», добавьте заголовок<h2>, напримерMore by Frank Herbert, и список<ul class="more">со всеми книгами этого автора, каждая из которых ведёт на страницу соответствующей книги.
Нажмите «Запустить» и выберите «Дюна»: под заголовком More by Frank Herbert вы увидите Children of Dune и Dune.
Попробуйте сами
{% 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 %}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Модели и панель администратора
Потренируйтесь самостоятельно: Песочница Django