Menu
CoddyTech

Cách sách được in

Thuộc phần Model và trang quản trị trong hành trình Django của Coddy. Bài học 5 trên 23.

Nhấn Chạy rồi nhập Book.objects.all() vào thẻ Shell: mỗi cuốn sách đều hiển thị <Book: Book object (1)>, nên bạn không thể phân biệt chúng. Book.objects.all() yêu cầu tất cả sách; chương tiếp theo sẽ giải thích điều này. Python chuyển một đối tượng thành văn bản bằng phương thức (method) __str__, còn phương thức mà mỗi mô hình (model) đều có chỉ hiển thị id. Một mô hình có thể tự định nghĩa phương thức này. Movie trên trang web phim có thể in ra tên phim và năm phát hành:

class Movie(models.Model):
    ...

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

Khi đó, Shell hiển thị <Movie: Alien (1979)>, và trang quản trị cùng mọi template in ra {{ movie }} cũng hiển thị như vậy. __str__ phải trả về văn bản. Một phương thức in văn bản ra sẽ trả về None, khiến str() gặp lỗi TypeError.

challenge icon

Thử thách

Dễ

Trong books/models.py, hãy để sách được in ra theo dạng tiêu đề, by và tên tác giả: Dune by Frank Herbert.

Nhấn Chạy rồi nhập Book.objects.all() trong thẻ Shell: giờ mỗi cuốn sách sẽ hiển thị như <Book: Dune by Frank Herbert>.

Tự làm thử

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)

Tất cả bài học trong Model và trang quản trị

Tự luyện tập: Playground Django