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

Django

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

こちらの記事では、

  • ArrayField内に保存したデータを利用し、動的な選択肢を作る方法

を解説しています

✔月9,800円でWebデザインが学べる

デザナルは、Webデザインに苦手意識がある方におすすめのサブスク型スクールです。

特徴は以下の通り。

  • 初期費用不要
  • 教材が使い放題
  • 案件で収入も得られる

デザナルは稼ぎながら学べる、格安のWebデザインスクールです。

>>詳細はこちら<<

安い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にした時に初期値を設定する

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

当ブログでは、日報アプリ開発を通じて、Webアプリを一から開発し公開するまでを初学者の方でもわかるようにと記事を連載しています

「Djangoでのアプリ開発を学びたい!」
「Djangoで開発したアプリをWebで公開するにはどうするの?」

という方は必見です!

【Django】チュートリアル|日報アプリの開発から公開まで
Djangoのチュートリアルをお探しですか?具体的に「手を動かして作ってみたい!」という方へ向けて、誰でもできる簡易的な日報アプリの開発を通じて、Djangoの様々な機能に触れていくシリーズとなっています。PythonでWebアプリを作りたい方、必見の記事となります!

タイトルとURLをコピーしました