前提・実現したいこと
Djangoでクイズゲームを作りたいと思っています。そこで、aタグ(次の問題へ)を押したら関数を実行させ、データベースにあるオブジェクト(問題)をランダムに表示させたいです。
具体的には、配列にオブジェクトの番号を格納したあと、配列をシャッフルさせて先頭から順番に要素を取り出したいです。
宜しければご教示願います。
発生している問題・エラーメッセージ
なし
該当のソースコード
----quiz.html---- {% extends "base.html" %} {% block content %} {% for question in question_list %} <h2>{{ question.question_text }}</h2> <li>{{ question.choices_1 }}</li> <li>{{ question.choices_2 }}</li> <li>{{ question.choices_3 }}</li> <li>{{ question.choices_4 }}</li> {% endfor %} <p>問題番号:{{ question_number }}</p> <a href="{% url 'NextQuestion' %}"><button>次の問題へ</button></a> {% endblock %}
該当のソースコード
----views.py---- number_of_question = Question.objects.all().count() # データベースに格納している問題数 question_array = [] # 問題番号を格納する配列を生成 for num in range(1,number_of_question + 1): question_array.append(num) # 問題番号を格納 def NextQuestion(request): template_name = 'quiz.html' random.shuffle(question_array) # 問題番号をシャッフル set_number = question_array[0] # 最初の問題番号を取得 context = { 'question_list': Question.objects.filter(question_number = set_number), "question_number":set_number } return render(request,template_name,context)
該当のソースコード
----models.py---- from django.db import models class Question(models.Model): class Meta: verbose_name_plural = "問題モデル" question_number = models.PositiveSmallIntegerField("問題番号",blank=True,null=True) question_text = models.CharField("問題文",max_length=100,blank=True,null=True) choices_1 = models.CharField("選択肢1",max_length=20,blank=True,null=True) choices_2 = models.CharField("選択肢2",max_length=20,blank=True,null=True) choices_3 = models.CharField("選択肢3",max_length=20,blank=True,null=True) choices_4 = models.CharField("選択肢4",max_length=20,blank=True,null=True) update_date = models.DateTimeField("更新日",blank=True,null=True)
試したこと
関数の中でループ処理をして順番に要素を取得させてみようとしましたが、
どうすればいいのか分かりませんでした。
補足情報(FW/ツールのバージョンなど)
エラーはありませんが、
下記のプログラムだとaタグ(次の問題へ)を押したらランダムに問題は表示されます。
しかし、同じ問題が続くときもあって、aタグ(次の問題へ)を押し続ける限り、
永遠と問題が表示されます。
一度表示された問題は出ないようにしたいです。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/12/20 01:53