質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.46%
Django

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

Python

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

Q&A

解決済

1回答

3673閲覧

Djangoでクイズゲームを作成する方法

bebebe

総合スコア2

Django

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

Python

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

0グッド

0クリップ

投稿2020/12/19 03:37

前提・実現したいこと

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タグ(次の問題へ)を押し続ける限り、
永遠と問題が表示されます。
一度表示された問題は出ないようにしたいです。

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

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

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

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

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

guest

回答1

0

ベストアンサー

下記のプログラムだとaタグ(次の問題へ)を押したらランダムに問題は表示されます。

原因はNextQuestionを呼び出す際に問題を取り出してシャッフルして返している事です
要はURLにアクセスする度にシャッフルされるので、元の順番がわからないという事ですね

解決策としては

最初に問題を全て記述すると、
bootstrap 4.5 navs javascript-behavior
のようなタブを切り替えると初めから問題文が記述されているようなものにするのもいいかもしれません

あと、シャッフルされた問題のidをhiddenで付与させておけばいいかもしれません

<input type="hidden" id="question1" value="{{id_1}}"> <input type="hidden" id="question2" value="{{id_2}}"> <!-- こんな感じ -->

で、現在のquestionには.activeでも付与して,
activeの前後のリンクをajax通信で、get_question/id_1みたいな感じで取得させ、描画するという感じ.

求めていた答えと違っていたらすみません.

投稿2020/12/19 06:38

編集2020/12/19 06:40
sk-sora--ypi

総合スコア530

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

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

bebebe

2020/12/20 01:53

回答ありがとうございます。 提案していただいた方法で試したところ、上手く動作しました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問