Menu
CoddyTech

Связанные имена

Часть раздела Модели и панель администратора путешествия по 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 %} перечисляет займы этой книги. Если имя написано с ошибкой, ничего не отображается и ошибка не возникает, поэтому, если список пуст, сначала проверьте имена.

challenge icon

Задание

Легко

Перечислите другие книги автора на странице каждой книги.

  1. В books/models.py задайте для Book.author связанное имя books, чтобы author.books.all() возвращал все книги этого автора.
  2. В 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 %}
quiz iconПроверьте себя

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

Все уроки раздела Модели и панель администратора

Потренируйтесь самостоятельно: Песочница Django