選択肢
CoddyのDjangoジャーニー「モデルと管理サイト」セクションの一部。レッスン 4/23。
ジャンルは任意のテキストではなく、いくつかの値のうちの1つであるべきです。choicesオプションを使うと、列挙クラスで指定したリストにフィールドの値を制限できます。映画サイトでは、映画の対象年齢を次のように制限できます。
class Movie(models.Model):
class Age(models.TextChoices):
ALL = "all", "All ages"
TEEN = "teen", "13 and over"
ADULT = "adult", "18 and over"
age = models.CharField(max_length=10, choices=Age, default=Age.ALL)各メンバーには、データベースに保存される値である"teen"と、利用者に表示されるラベルである"13 and over"があります。コードではMovie.Age.TEENと書くため、入力ミスは新しい値ではなくエラーになります。このクラスは、それを使うフィールドより前に定義します。
フォームと管理画面にはラベルがドロップダウンで表示され、ほかの値は拒否されます。ただし、データベース自体はチェックしません。movie.get_age_display()は、その行のラベルを返します。
チャレンジ
簡単Bookにジャンルを追加します。
Bookの内部に、選択肢クラスGenreを作成します。選択肢はFICTION("fiction"、"Fiction")、SCIFI("scifi"、"Science fiction")、MYSTERY("mystery"、"Mystery")、HISTORY("history"、"History")です。- 最大20文字で、これらの選択肢に限定され、別のものを選ばない限りフィクションが初期値となるフィールド
genreを追加します。
ShellタブでBook.Genre.SCIFI.labelを試してください。
自分で試してみよう
from django.db import models
class Book(models.Model):
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)
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
モデルと管理サイトのすべてのレッスン
自分で練習してみよう: Djangoプレイグラウンド