views.pyで作成した選択肢をforms.pyへ渡す方法はこちらで解説しました
こちらの記事では、
- ArrayField内に保存したデータを利用し、動的な選択肢を作る方法
を解説しています
はじめに
下記の2つをすでに理解している方は次の章までスキップをお勧めします
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へ値を渡す方法について詳しく知りたい!」という方はこちらをご覧ください↓
forms.pyでの記述
こちらの記事の通り受け取った値をchoices引数へ代入します↓
おわりに
ArrayFieldというリストを保存できるFieldを使い、保存されているデータに合わせて選択肢を作れる方法を紹介しました
ただし、このままではUpdateViewの場合に初期値が設定されなくなってしまいます
別記事にて、
UpdateViewにした時に初期値を設定する
方法をお伝えしていければと思います