質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

0回答

1120閲覧

Djangoのinlineformset_factoryでフォームを複製したとき、それぞれで異なるフィルターをかけたい

am120sec

総合スコア14

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

1クリップ

投稿2019/01/12 04:40

編集2019/01/13 06:13

やりたいこと

親カテゴリに紐づくManyToManyのフィールドのフォームを作った時、
親カテゴリの種類に応じてフィルターをかけたい。
理想は以下のようなフォームを作りたいです。
どの様なコード、方法を取れば良いでしょうか。
理想

現状

以下のようなフォームを作ることは出来ていますが
問題点は2点あり、
1.labelをform.py上で生成できない。
2.extraで複製したときにそれぞれのフィールドで異なるフィルタをかけれない。(FreeTag全てが選択肢として表示)

現在

Django

1# models.py 2 3class TagElement(models.Model): 4 name = models.CharField(max_length=20, unique=True) 5 6 def __str__(self): 7 return self.name 8 9 10class FreeTag(models.Model): 11 name = models.CharField(max_length=20, unique=True) 12 elements = models.ForeignKey(TagElement, on_delete=models.CASCADE) 13 14 def __str__(self): 15 return self.name 16 17 18class Item(models.Model): 19 title = models.CharField(max_length=40, unique=True) 20 tag = models.ManyToManyField(FreeTag, blank=True) 21 22 def __str__(self): 23 return self.title 24 25 26# forms.py 27 28class ModelFormWithFormSetMixin(): 29 """inlineformset_factoryをModelFormに含める""" 30 def __init__(self, *args, **kwargs): 31 super(ModelFormWithFormSetMixin, self).__init__(*args, **kwargs) 32 if self.is_bound: 33 self.formset = self.formset_class( 34 instance=self.instance, 35 data=self.data 36 ) 37 else: 38 self.formset = self.formset_class() 39 40 def is_valid(self): 41 return super(ModelFormWithFormSetMixin, self).is_valid() and self.formset.is_valid() 42 43 def save(self, commit=True): 44 saved_instance = super(ModelFormWithFormSetMixin, self).save(commit) 45 self.formset.save(commit) 46 return saved_instance 47 48 49TagInlineFormSet = inlineformset_factory( 50 Item, 51 Item.tag.through, 52 fields='__all__', 53 can_delete=False, 54 extra=10, 55 ) 56 57 58class ItemCreateForm(ModelFormWithFormSetMixin, forms.ModelForm): 59 formset_class = TagInlineFormSet 60 61 class Meta: 62 model = Item 63 fields = ('title',) 64 65 66# Views.py 67 68class ItemCreate(generic.CreateView): 69 model = Item 70 form_class = ItemCreateForm 71 template_name = 'main_app/item_create.html' 72 73 def get_success_url(self): 74 return reverse('main_app:item_detail', args=(self.object.id,))

ちなみに当初は以下のようなフォームを作っていましたが
フォームの表示までは出来てもDBに保存されなかったため、
inlineformset_factoryを使用することにしました。

Django

1class ItemCreateForm(forms.ModelForm): 2 tag_age = forms.ModelChoiceField( 3 label='年代', 4 queryset=FreeTag.objects.filter(elements__name='年代'), 5 ) 6 tag_country = forms.ModelChoiceField( 7 label='制作国', 8 queryset=FreeTag.objects.filter(elements__name='制作国'), 9 ) 10 tag_language = forms.ModelChoiceField( 11 label='言語', 12 queryset=FreeTag.objects.filter(elements__name='言語'), 13 ) 14 15 # .... 16 17 model = Item 18 fields = ('title',)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問