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

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

詳細はこちら
Django

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

Q&A

解決済

1回答

972閲覧

[Django] 複数選択のCheckbuttonについて

luciano

総合スコア11

Django

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

POST

POSTはHTTPプロトコルのリクエストメソッドです。ファイルをアップロードしたときや入力フォームが送信されたときなど、クライアントがデータをサーバに送る際に利用されます。

0グッド

2クリップ

投稿2021/03/18 09:18

編集2021/03/22 02:11

現在、単語帳のWebアプリを試作しています。

  • Checkbuttonで品詞とそのレベルをチェックを入れる。(但し、ここではまだPOSTはしない。)
  • QuestionボタンでPOSTし、上記で選んだ条件をリストに格納し、そこからランダムに出題
  • Answerボタンで、別途用意した辞書から解答を得る、

という形のものです。

その際、Questionボタンを押すと、チェックボックス でのチェックが全てクリアされ、次の出題のため、そのまま再度Questionボタンを押すと、次ののエラーメッセージが出てしまいます。

Cannot choose from an empty sequence

再度チェックをし直せば動くのですが、毎回チェックをする手間を省き、チェックの状態がクライアント側(?)に残ったままをキープできる方法を探しています。色々調べてみたのですが、どうしても解決できず、ここで’質問させていただくことにしました。

このような場合、以下のどの点が問題となるのかだけでもヒントを頂ければ助かります。

  1. そもそもforms.MultipleChoiceFieldの仕様がそういうものなのか?
  2. forms.MultipleChoiceFieldのパラメータの設定の問題なのか?
  3. vies.pyのコードでの初期化(def init(self))の問題なのか?
  4. その他のコード(以下)に問題があるのか?

どうかよろしくお願いします。

[forms.py]

python

1class SelectForm(forms.Form): 2 3 verbs= forms.MultipleChoiceField ( 4 label = '動詞', 5 choices = [ 6 ("verbs_1", "(1)"), 7 ("verbs_2", "(2)"), 8 ("verbs3", "(3)"), 9 ], 10 widget = forms.CheckboxSelectMultiple(), 11 required=False 12 ) 13 14 adjectives= forms.MultipleChoiceField ( 15 label = '形容詞', 16 choices = [ 17 ("adjectives_1", "(1)"), 18 ("adjectives_2", "(2)"), 19 ("adjectives_3", "(3)"), 20 ], 21 widget = forms.CheckboxSelectMultiple(), 22 required=False 23 )

[table.py]

python

1verbs_1 = ['fly', 'see', 'meet', --------] 2verbs_2 = ['appreciate', 'notify', --------] 3adjectives_1 = ['beautiful', 'good', --------] 4adjectives_2 = ['gorgeous', attractive', --------] 5dict = {'fly':'飛ぶ', 'see':'見る', 'meet':'会う','gorgeous':'ゴージャス', 'attractive':'魅力的', -------} 6

[views.py]

python

1from .forms import SelectForm 2import random 3from . table import * 4 5class Question(TemplateView): 6 7 def __init__(self): 8 self.params = { 9 'question: "", 10 'answer': "", 11 (中略) 12 'form': SelectForm(), 13 } 14 15 def get(self, request): 16 return render (request, 'main.html', self.params) 17 18 def post (self, request): 19 20 global answer_fnl, word_fnl 21 22 if "button_question" in request.POST: 23 24 #チェックボタンから候補選択のリストを作る 25 verbs_chcd = request.POST.getlist('verbs') 26 adjectives_chcd = request.POST.getlist('adjectives') 27 28 #上記リストを結合 29 words_cnddt = verbs_chcd + adjectives_chcd 30 31 #random.choiceで単語を選ぶ 32 word_fnl = random.choice(words_cnddt) 33 34 #Answerを作る 35 answer_fnl = dict.get(word_fnl) 36 37 #表示 38 self.params['question'] = word_fnl 39 40 if "button_answer" in request.POST: 41 self.params['question'] = word_fnl 42 self.params['answer'] = answer_fnl 43 44 return render (request, 'main.html', self.params)

[main.html]

html

1<div class="container-fluid"> 2 <div class="col"> 3 <h2>{{question|safe}}</h2> 4 </div> 5</div> 6 7<div class="container-fluid"> 8 <div class="col"> 9 <h2>{{answer}}</h2> 10 </div> 11</div> 12 13<!-- ボタン --> 14 15<form action="" method="post"> 16 {% csrf_token %} 17 18 <div class="container-fluid"> 19 20 <div class="d-flex justify-content-center"> 21 <div class="col-6 text-right"> 22 <button type="submit" name="button_question" value="Question"> 23 Question 24 </button> 25 <div class="col-6 text-left"> 26 <button type="submit" name="button_answer" value="Answer"> 27 Answer 28 </button> 29 </div> 30 </div> 31 </div> 32 </div> 33 34 <!--選択 --> 35 36 <div class="container-fluid"> 37 <div class="row"> 38 <div class="col-6 col-md-3">{{ form.verbs|as_crispy_field }} </div> 39 <div class="col-6 col-md-3">{{ form.adjectives|as_crispy_field }} </div> 40 </div>

補足情報(FW/ツールのバージョンなど)

*[環境]

  • Mac Os Catalina
  • Django 3.1.1
  • Python 3.8

以前にも同様な質問をしましたが、回答が付かず、書き直して再質問させていただいています。

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

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

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

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

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

guest

回答1

0

自己解決

views.pyに```python
self.params['form'] = SelectForm(request.POST)

結果的に、質問の4問題でした。

投稿2021/04/05 23:00

luciano

総合スコア11

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問