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

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

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

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

Q&A

解決済

1回答

441閲覧

Django - チェックボックスを外部キーでグルーピングしたい

nk18

総合スコア14

Django

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

0グッド

0クリップ

投稿2019/04/25 13:46

ユーザーごとに好きな食べ物を登録できるサイトを作っております。フォーム入力の際に、外部キーでグルーピングしたチェックボックスを表示させたいと考えております。

こんなイメージです。
Fruits
□ Apple
☑︎ Orange
☑︎ Lemon

Vegetable
□ Tomato
☑︎ Eggplant
☑︎ Cucumber

テーブル構造
● FoodsType
id | name
1, Fruits
2, Vegetable

● Foods
id | name | type_id
1, Apple, 1
2, Orange, 1
3, Lemon, 1
4, Tomato, 2
5, Eggplant, 2
6, Cucumber, 2

● UserFoods
id | foods_id | user_id
1, 2, 1
2, 3, 1
3, 5, 1
4, 6, 1
5, 2, 2
6, 3, 2
7, 5, 2
8, 2, 3

▪️ models.py

class FoodsType(models.Model): name = models.CharField(max_length=255) def __str__(self): return self.name class Foods(models.Model): name = models.CharField(max_length=255) type = models.ForeignKey(FoodsType, on_delete=models.CASCADE) def __str__(self): return self.name class UserFoods(models.Model): foods = models.ManyToManyField(Foods) user = models.ForeignKey(UserProfile, on_delete=models.CASCADE)

▪️ form.py

class FoodsFrom(forms.ModelForm): foods = forms.ModelMultipleChoiceField(label='favorite foods', queryset=Foods.objects.all(), widget=forms.CheckboxSelectMultiple) class Meta: model = Foods fields = ('name', 'type')

▪️ view.py

class registerForm(generic.CreateView): def get(self, request): food_form = FoodsFrom() context = { 'food_form': food_form } return render(request, 'register.html', context)

▪️ register.html

{% for field in food_form %} <tr> <th><label for="{{ field.id_for_label }}">{{ field.label }}</label></th> <td>{{ field }} {{ field.errors }}</td> </tr> {% endfor %}

現在の結果は外部キーでのグルーピングができておりません。何卒よろしくお願いいたします。
□ Apple
☑︎ Orange
☑︎ Lemon
□ Tomato
☑︎ Eggplant
☑︎ Cucumber

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

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

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

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

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

guest

回答1

0

ベストアンサー

さまざまなアプローチがあるかと思いますが、 ModelMultipleChoiceField を継承した独自のフィールドクラスを作るやり方が最も素直な方法なのではないかと思います。このアプローチで行く場合はこのあたりのページ ↓ がご参考になるのではないでしょうか。

これらのページを読んでちょっと大変そうだなとお感じになる場合は、別のアプローチを探すか別の表現方法をお考えになるのがよいのかなという印象です。

投稿2019/04/26 05:57

gh640

総合スコア1407

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

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

nk18

2019/04/26 06:26

ありがとうございます!ModelMultipleChoiceFieldをもう少し調べてみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問