Menu
CoddyTech

Страница для каждой книги

Часть раздела Модели и панель администратора путешествия по Django на Coddy. Урок 14 из 23.

Для каждой книги нужна страница по собственному адресу: /books/1/, /books/2/. Конвертер пути из курса Django Basics захватывает это число и передаёт его представлению. Страница со списком книг за один год:

path("years/<int:year>/", views.books_of_year, name="books_of_year"),

def books_of_year(request, year):
    books = Book.objects.filter(year=year)
    return render(request, "books/year.html", {"year": year, "books": books})

Страница одной записи идентифицирует её по первичному ключу, pk: её id. Если запись не найдена, вызов get() вызывает исключение, а исключение в представлении приводит к сбою — 500 Server Error. Вместо этого get_object_or_404() из django.shortcuts возвращает ответ 404 Page not found. Сначала передай ей модель, затем условия: get_object_or_404(Book, title="Emma").

Чтобы создать ссылку на маршрут, который захватывает значение, укажи это значение после имени: {% url 'books:books_of_year' book.year %}.

challenge icon

Задание

Средне

Создай страницу для каждой книги. Шаблон books/book_detail.html готов и ожидает book.

  1. В books/views.py напиши book_detail(request, pk): она показывает книгу с этим идентификатором или возвращает ответ 404.
  2. В books/urls.py направь путь /books/<id>/, только с числами, на неё под именем book_detail.
  3. В home.html добавь ссылку на страницу каждой книги в её заголовок. Ссылкой должен быть только заголовок: <a ...>Dune</a> (1965).

Нажми на Dune на главной странице, затем открой /books/999/: Страница не найдена (404).

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

from django.shortcuts import render

from .models import Book


def home(request):
    books = Book.objects.all()
    return render(request, "books/home.html", {"books": books})

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

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