🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Django

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1674閲覧

Djangoのformで可変長のフォームを作りたい

kokorin

総合スコア73

Django

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/10/28 19:05

Djangoを使ってフォームの作成をしているのですが、可変長のフォームをどのように作ればよいのかわかりません。

forms.pyの中にチェックボックスフォームを作り、views.pyでそのフォームの内容を書き換えられるようにしています。
具体的には、views.pyの中で、質問のリストを作り、Questionクラスをリストにすることで実現しようとしています。
しかし、クラスをリストにして渡すとチェックボックスがうまく表示されません。
このような場合、どのように設計するのが良いのでしょうか。

forms.py

python

1 2 3from django import forms 4 5class Question(forms.Form): 6 like = forms.BooleanField( # チェックボックスのフィールド 7 required=False, 8 disabled=False, 9 label='like', 10 ) 11 12 want = forms.BooleanField( # 2つめのチェックボックス 13 required=False, 14 disabled=False, 15 label='want', 16 ) 17 18 def __init__(self, food_name): # 質問(?)を保存しておく 19 self.food_name = food_name

views.py

python

1 2from django.shortcuts import render 3from .forms import Question 4 5 6def common_subjects(request): 7 food_list = ['お寿司', 'カレー', 'ラーメン', 'チャーハン'] # ここが質問のリスト。追加することで自動的に質問数が増えるようにしたい 8 questions = [] 9 for food in food_list: 10 questions.append(Question(food)) 11 return render(request, 'food/index.html', { 12 'questions': questions, 13 })

index.html

html

1<html> 2 3<body> 4 <form action="" method="post"> 5 {% csrf_token %} 6 <table border="1"> 7 <tr> 8 <th>食べ物</th> 9 <th>好き</th> 10 <th>食べたい</th> 11 </tr> 12 {% for question in questions %} 13 <tr> 14 <td>{{ question.food_name }}</td> 15 <td>{{ question.like }}</td> 16 <td>{{ question.wants }}</td> 17 </tr> 18 {% endfor %} 19 </table> 20 <input type="submit" value="送信"> 21 </form> 22</body> 23 24</html>

実行結果

実行結果

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

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

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

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

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

guest

回答1

0

ベストアンサー

やりたいことは、例えば

food_list = ['お寿司', 'カレー', 'ラーメン', 'チャーハン']

の部分を

food_list = ['お寿司', 'カレー', 'ラーメン', 'チャーハン', '牛丼']

のようにしたら実行結果のテーブルが次のうようになるイメージですか?

食べ物好き食べたい
お寿司
カレー
ラーメン
チャーハン
牛丼

もしそうだとすると、

food_list = ['お寿司', 'カレー', 'ラーメン', 'チャーハン']

をviews.pyで定義するのではなく、models.pyでFoodテーブルを作った方が良いと思います。

Foodは、
foodnameをCharaで、好きと食べたいをBooleanで定義すると良いでしょう。

投稿2019/10/28 22:31

ak_suzuki

総合スコア194

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

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

kokorin

2019/10/29 03:32

回答ありがとうございます! 最終的には、お寿司、カレー、ラーメンなどの食べ物をそれぞれ、和食、洋食、中華などのカテゴリに割り振っておいて、 その人の「好きな食べ物」と「食べたいもの」をカテゴリ別で集計して表示させたいのですが、models.pyにfoodを定義することで、そのように動作させることは可能なのでしょうか?
ak_suzuki

2019/10/29 04:24

「その人の「好きな食べ物」と「食べたいもの」をカテゴリ別で集計して表示」ですね。 はい、可能です。 私なら次のように構造を考えて設計します。 1. categoryモデルを作る 2. foodモデルを作り、categoryを外部参照(foreignkey)する 3. likeモデルを作り、userとfoodを外部参照。 likeモデルは、 userとfoodを項目としてもち、「好き」とされた場合に登録。 例えばあるユーザーがお寿司とカレーを好きならば、likeのデータは2レコードできる。 4. wantモデルを作り、likeと同様に食べたいとされたものを管理。これもuserとfoodのペアのデータ。 5. 表示するテンプレートには、views.pyからaggregate関数などを使って集計値を表示。 最初の回答のbooleanを使う方法は、「userごと」と言う想定ではなかったので忘れてください。
kokorin

2019/10/29 05:02

ご丁寧に説明してくださって本当にありがとうございます。 今後の指針がわかってきました。上のようなモデルをこれから実装してみたいと思います。
kokorin

2019/10/30 05:39

すみません、モデルの作成はできたと思うのですが、二つのテーブルからフォームを作成する方法がわかりません。 お時間ありましたら、教えていただけるとありがたいです。 新しい質問ページも作ってあります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問