前提・実現したいこと
Djangoの練習を行うために、出題された英単語に対し、正しい意味を選択した場合に点数を加算するプログラムを作成しています。JavaScriptをほとんど触ったことがないので、手動で作成したコンテキストをhtml側のテンプレートタグで展開し、そこで判定するためのサンプルを作成している状況です。
問題と回答の紐付けの方法をかんがえ
発生している問題・エラーメッセージ
正しい答えを選択して集計ボタンを押しても、点数が0点から変化しない状態です。
該当のソースコード
python
1views.py 2 3def sample(request): 4 quiz_answer_dict = { 5 'sample': {'例': ['りんご', '取る', '例', '考える']}, 6 'think': {'考える': ['オレンジ', '考える', '取る', 'お茶']}, 7 'listen': {'聞く': ['見る', '泳ぐ', '聞く', '得する']}, 8 'swim': {'泳ぐ': ['りんご', '例', '泳ぐ', 'ノート']}, 9 } 10 11 return render( 12 request, 13 'wordapp/quiz_sample.html', 14 {'quiz_answer_dict': quiz_answer_dict} 15 )
html
1<h3>クイズ</h3> 2{% for question_english, answer_choice_dict in quiz_answer_dict.items %} 3 <div class="quiz"> 4 <p class="question_english">{{ question_english }}</p> 5 {% for answer, choice_list in answer_choice_dict.items %} 6 <p class="answer">answer: {{ answer }}</p> 7 <form name="choice_form"> 8 {% csrf_token %} 9 {% for choice in choice_list %} 10 <input class="choice" type="radio" value="{{ choice }}" name="choice">choice: {{ choice }} 11 {% endfor %} 12 </form> 13 {% endfor %} 14 </div> 15{% endfor %} 16<input type="button" value="集計" onclick="aggregate()"> 17<p>正解した問題数 <span id="number_of_right_answer"></span></p>
javascript
1function aggregate(){ 2 let number_of_right_answer = 0; 3 const quiz_list = document.querySelectorAll("div.quiz"); 4 console.log(quiz_list); 5 /* 6 問題単位のループ 7 */ 8 for (let i = 0; i < quiz_list.length; i++){ 9 const quiz = quiz_list[i]; 10 const answer = quiz.querySelectorAll("p.answer"); 11 const choices = quiz.querySelectorAll("input[name='choice']"); 12 /* 13 選択肢単位のループ 14 */ 15 for (let j = 0; j < choices.length; j++){ 16 if(choices[j].checked){ 17 if(choices[j].value == answer){ 18 number_of_right_answer++; 19 break; 20 } 21 } 22 } 23 } 24 25 document.getElementById("number_of_right_answer").textContent = number_of_right_answer; 26}
試したこと
こちらを参考に、
- formに名前をつけて、一括して取得してから判定する方法
↓
javascript
1const choice1 = document.form1.value;
の1,2,...と変化していく変数名をfor文とlengthから作成する方法が思いつかなかったので断念しました。
- inputのname属性の値を利用して、一括して取得して判定する方法
↓
javascript
1const choice = document.getElementsByName("choice1");
問題と回答を紐付ける方法を思いつかなかったので断念しました。
補足情報(FW/ツールのバージョンなど)
python 3.7.9
Django 3.1.6
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/02/21 02:56