現在、単語帳のWebアプリを試作しています。
- Checkbuttonで品詞とそのレベルをチェックを入れる。(但し、ここではまだPOSTはしない。)
- QuestionボタンでPOSTし、上記で選んだ条件をリストに格納し、そこからランダムに出題
- Answerボタンで、別途用意した辞書から解答を得る、
という形のものです。
その際、Questionボタンを押すと、チェックボックス でのチェックが全てクリアされ、次の出題のため、そのまま再度Questionボタンを押すと、次ののエラーメッセージが出てしまいます。
Cannot choose from an empty sequence
再度チェックをし直せば動くのですが、毎回チェックをする手間を省き、チェックの状態がクライアント側(?)に残ったままをキープできる方法を探しています。色々調べてみたのですが、どうしても解決できず、ここで’質問させていただくことにしました。
このような場合、以下のどの点が問題となるのかだけでもヒントを頂ければ助かります。
- そもそもforms.MultipleChoiceFieldの仕様がそういうものなのか?
- forms.MultipleChoiceFieldのパラメータの設定の問題なのか?
- vies.pyのコードでの初期化(def init(self))の問題なのか?
- その他のコード(以下)に問題があるのか?
どうかよろしくお願いします。
[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
以前にも同様な質問をしましたが、回答が付かず、書き直して再質問させていただいています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。