サイトアイコン ITC Media

【Django】ChoiceField ArrayFieldで動的な選択肢を作成する

views.pyで作成した選択肢をforms.pyへ渡す方法はこちらで解説しました

こちらの記事では、

を解説しています

筆者プロフィール

【現職】プロダクトマネージャー

【副業】ブログ(月間20万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。現在はプロダクトマネージャーとして、さまざまな関係者の間に入り奮闘してます。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

はじめに

下記の2つをすでに理解している方は次の章までスキップをお勧めします

この章で解説すること
  • ArrayFieldについて
  • choicesへ値をパスする通常の方法

ArrayFieldについて

公式ドキュメントでは、データベースをpostgresqlにした場合、ArrayFieldをインポートし使用できるということです

from django.contrib.postgres.fields import ArrayField

データベースがpostgresql出ない場合はこちらのFieldを使うことができません

【models.py】

今回選択肢としてデータを取り出すモデルはこちら↓

class PersonalSettings(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    categories = ArrayField(models.CharField(max_length=10, blank=True), size=20)

    def __str__(self):
        return f"settings of {self.user.email}"

ArrayFieldにはcategoriesというフィールド名が与えられています

テキストのリスト(最大要素数:20)となっています

views.pyでの記述

    def get_form_kwargs(self, *args, **kwargs):
        kwgs = super().get_form_kwargs(*args, **kwargs)
        personalsetting = PersonalSettings.objects.get(user=self.request.user)
        categories = personalsetting.categories
        category_choice = [(i, i) for i in categories]
        kwgs["categories"] = category_choice
        return kwgs

get_form_kwargs関数内で、モデルから取り出したリストを選択肢にできるよう下記のようにタプル化しています↓

[(要素1, 要素1), (要素2, 要素2)....]

その後、kwgs内[“categories”]としてforms.pyへリストを渡しています

参考記事:☆ChoiceField choicesの値を動的に操作する☆

※「get_form_kwargsからforms.pyへ値を渡す方法について詳しく知りたい!」という方はこちらをご覧ください↓

☆views.pyからforms.pyへ値を渡す☆

forms.pyでの記述

こちらの記事の通り受け取った値をchoices引数へ代入します↓

おわりに

ArrayFieldというリストを保存できるFieldを使い、保存されているデータに合わせて選択肢を作れる方法を紹介しました

ただし、このままではUpdateViewの場合に初期値が設定されなくなってしまいます

別記事にて、

UpdateViewにした時に初期値を設定する

方法をお伝えしていければと思います

モバイルバージョンを終了