【django】フィールドのchoicesで選択肢から選ぶ方法

djangoでアプリを開発した際に,フォームの入力欄の1つに選択肢を実装したいと思ったことはありませんか?

djangoでは選択肢を実装する際に,フィールドオプションの1つであるchoicesを用います

選択肢をmodels.pyで用意して,selectする場合の実装方法について解説します

他のモデルを容易して,そこから選択肢を作成する発展版は下記の記事にまとめています

目次

実装する選択肢のモデル

ブログ記事のカテゴリー分類をするためにフィールドオプションの1つであるchoicesを実装します

今回はプログラミング言語の種類を4つ用意し,選択肢とします

ブログ記事を書いた際に,その記事のプログラミング言語を指定します

models.pyでモデルにchoicesを追加する

models.pyに選択肢となる2次元配列を用意します

配列の中身

LANG_TYPES = (
(データベースに保存される値, フォームウィジェットに表示される値),
(英語を推奨します, こちらはなんでも大丈夫),
(‘css’, ‘CSS’),
(‘html’, ‘HTML’),
)

そして,選択しを選ぶために,カラムを1つ追加しましょう

本記事ではlang_typeという名前のCharFieldを実装しました

class Blog(models.Model):
    LANG_TYPES = (
        ('py', 'Python'),
        ('js', 'Javascript'),
        ('css', 'CSS'),
        ('html', 'HTML'),
    )
    title = models.CharField(max_length=200)
    content = models.TextField(blank=True)
    lang_type = models.CharField(max_length=50, choices=LANG_TYPES, blank=True) # 追加
    updated_at = models.DateTimeField(auto_now=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.title

    class Meta:
        db_table = 'blogs'

models.pyの選択肢のカラムをデータベースに反映させる

command promptで下記を入力し,データベースに変更を反映します

うまくいった場合は次のステップに進んでください

python manage.py makemigrations blog
python manage.py migrate

下記のようなエラーが出た場合は,lang_typeのデフォルトをどうするか決めてあげましょう

とりあえず,2を入力してQuitして,models.pyのlang_typeを編集します

You are trying to add a non-nullable field 'lang_type' to blog without a default; we can't do that (the database needs something to populate existing rows).
Please select a fix:
 1) Provide a one-off default now (will be set on all existing rows with a null value for this column)
 2) Quit, and let me add a default in models.py 

解決方法は2つあります

解決方法
  1. blank=Trueとして空文字を許容する
  2. default=’py’としてデフォルトを決定する

selectでChoiceフィールドの値を実際に入力する

サーバーを立ち上げて,adminに入りましょう

http://127.0.0.1:8000/admin/

choice

このように選択できるようになりました

参考文献

お疲れ様でした

シェアしてくださると嬉しいです!
  • URLをコピーしました!

コメント

コメントする

目次