djangoでアプリを開発した際に,フォームの入力欄の1つに選択肢を実装したいと思ったことはありませんか?
djangoでは選択肢を実装する際に,フィールドオプションの1つであるchoicesを用います
選択肢をmodels.pyで用意して,selectする場合の実装方法について解説します
他のモデルを容易して,そこから選択肢を作成する発展版は下記の記事にまとめています
【django】カテゴリーモデルから選択肢を作成する方法 (models.ForeignKey)
djangoでアプリを開発した際に,フォームの入力欄の1つに選択肢を実装したいと思ったことはありませんか? djangoでは選択肢を実装する際に,Choiceフィールドを用いま…
目次
実装する選択肢のモデル
ブログ記事のカテゴリー分類をするためにフィールドオプションの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つあります
解決方法
- blank=Trueとして空文字を許容する
- default=’py’としてデフォルトを決定する
selectでChoiceフィールドの値を実際に入力する
サーバーを立ち上げて,adminに入りましょう
http://127.0.0.1:8000/admin/
このように選択できるようになりました
参考文献
Model field reference | Django documentation
The web framework for perfectionists with deadlines.
お疲れ様でした
コメント