Menu
CoddyTech

Как выводится книга

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

Нажми «Запустить» и введи Book.objects.all() на вкладке Shell: у каждой книги отображается <Book: Book object (1)>, и ты не можешь отличить их друг от друга. Book.objects.all() запрашивает все книги; следующая глава объяснит, как это работает. Python преобразует объект в текст с помощью метода __str__, а метод, который есть у каждой модели по умолчанию, показывает только идентификатор. Модель может определить собственный метод. Например, Movie на сайте о фильмах может выводить название и год:

class Movie(models.Model):
    ...

    def __str__(self):
        return f"{self.title} ({self.released.year})"

Тогда в оболочке отображается <Movie: Alien (1979)>, как и в административной панели и любом шаблоне, который выводит {{ movie }}. Метод __str__ должен возвращать текст. Метод, который выводит его на экран, возвращает None, и тогда str() завершается ошибкой TypeError.

challenge icon

Задание

Легко

В books/models.py сделай так, чтобы книга выводилась как её название, by и имя автора: Dune by Frank Herbert.

Нажми «Запустить» и введи Book.objects.all() на вкладке Shell: теперь каждая книга отображается так: <Book: Dune by Frank Herbert>.

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

from django.db import models


class Book(models.Model):
    class Genre(models.TextChoices):
        FICTION = "fiction", "Fiction"
        SCIFI = "scifi", "Science fiction"
        MYSTERY = "mystery", "Mystery"
        HISTORY = "history", "History"

    title = models.CharField(max_length=200)
    author = models.CharField(max_length=100)
    year = models.IntegerField()
    price = models.DecimalField(max_digits=6, decimal_places=2)
    is_read = models.BooleanField(default=False)
    finished = models.DateField(null=True, blank=True)
    summary = models.TextField(blank=True)
    genre = models.CharField(max_length=20, choices=Genre, default=Genre.FICTION)

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

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