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

challenge icon

Задание

Легко
  • Задай для Book.author обратное имя books.
  • В book_detail.html, над ссылкой «Назад», добавь <h2> вроде More by Frank Herbert и <ul class="more"> со списком всех книг этого автора, каждая из которых ведёт на страницу соответствующей книги.

Нажми Run и открой страницу книги.

Попробуйте сами

{% 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