Menu
CoddyTech

Bookの表示方法

CoddyのDjangoジャーニー「モデルと管理サイト」セクションの一部。レッスン 5/23。

「Run」を押し、ShellタブでBook.objects.all()と入力します。すべての本が<Book: Book object (1)>と表示され、区別できません。Book.objects.all()はすべての本を要求します。詳しくは次の章で説明します。Pythonでは、オブジェクトをテキストに変換するために__str__メソッドを使います。すべてのモデルに用意されているこのメソッドは、idだけを表示します。モデルには独自のメソッドを定義できます。映画サイトのMovieなら、タイトルと公開年を表示できるでしょう。

class Movie(models.Model):
    ...

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

すると、Shellには<Movie: Alien (1979)>と表示されます。adminや、{{ movie }}を表示するテンプレートでも同じです。__str__はテキストを返す必要があります。テキストを表示するだけのメソッドはNoneを返すため、その後str()を呼び出すとTypeErrorが発生します。

challenge icon

チャレンジ

簡単

books/models.pyで、本がタイトル、by、著者の順に表示されるようにします:Dune by Frank Herbert。

「実行」を押し、「シェル」タブでBook.objects.all()と入力します。各本は<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プレイグラウンド