前提・実現したいこと
カテゴリーをIDで指定し、カテゴリーに属するクイズからランダムに出題するアプリを作っています。
しかし、カテゴリーごとにcontextをテンプレートに渡せるものと、404になるものがあります。
画面はquiz_list.html(カテゴリーの選択)→question.html(スタート画面)→selected_quiz.html(クイズ画面)と遷移します。
今回の場合ですとカテゴリーIDが2はうまくいきますがカテゴリーIDが2以外だと404になります。
カテゴリーIDが違うだけな気がするのですが、何が成否を分けているのか全くわかりません。ご教授お願いします。
発生している問題・エラーメッセージ
Page not found (404) Request Method: GET Request URL: http://localhost:8000/quiz/3/selected_quiz/ Raised by: quiz.views.SelectedQuizView No quiz info found matching the query
該当のソースコード
urls.py
Python
1urlpatterns = [ 2 re_path(r'(?P<pk>\d+)/question', views.QuestionView.as_view(), name='question'), 3 re_path(r'(?P<pk>\d+)/list', views.QuizListView.as_view(), name='quiz_list'), 4 re_path(r'(?P<pk>\d+)/selected_quiz', views.SelectedQuizView.as_view(), name='selected_quiz'), 5 ]
views.py
Python
1class QuizListView(generic.ListView): 2 model = QuizInfo 3 template_name = 'quiz/quiz_list.html' 4 context_object_name = 'quiz_list' 5 6 def get_context_data(self, *, object_list=None, **kwargs): 7 context = super().get_context_data(**kwargs) 8 context['question'] = Quiz_category.objects.filter(id=self.kwargs['pk']).first() 9 return context 10 11 def get_queryset(self): 12 return QuizInfo.objects.filter(quiz_category_id=self.kwargs['pk']) 13 14 15class QuestionView(generic.TemplateView): 16 template_name = 'quiz/question.html' 17 18 def get_context_data(self, **kwargs): 19 context = super().get_context_data(**kwargs) 20 context['question'] = Quiz_category.objects.filter(id=self.kwargs['pk']).first() 21 return context 22 23class SelectedQuizView(generic.DetailView): 24 model = QuizInfo 25 template_name = 'quiz/selected_quiz.html' 26 context_object_name = 'quiz' 27 28 def get_context_data(self, **kwargs): 29 context = super().get_context_data(**kwargs) 30 # カテゴリー別のクイズ一覧からランダムに一つ選択して出題する。 31 context['quiz'] = random.choice(QuizInfo.objects.filter(quiz_category_id=self.kwargs['pk'])) 32 return context
models.py
Python
1# 問題の所属するカテゴリ-(ex 医療、動物、工学など) 2class Quiz_category(models.Model): 3 category = models.CharField(max_length=200) 4 parent_id = models.ForeignKey('self', blank=True, null=True, on_delete=models.CASCADE) 5 register_time = models.DateTimeField(auto_now_add=True) 6 7 def __str__(self): 8 return self.category 9 10# クイズに関する情報をすべて格納する 11class QuizInfo(models.Model): 12 quiz_name = models.CharField(max_length=200) 13 quiz_text = models.TextField(blank=True, default='') 14 publisher = models.ForeignKey(User, related_name='publisher', on_delete=models.CASCADE) #クイズを投稿したユーザ 15 correct_answer_percentage = models.IntegerField(default=0) 16 quiz_category_id = models.ForeignKey(Quiz_category, on_delete=models.CASCADE, related_name='categories') 17 img = models.ImageField(upload_to='img/',blank=True, default='') 18 quiz_img = ImageSpecField(source='img', format='JPEG', processors=[ResizeToFill(1000,800)], options={'quality': 50}) 19 quiz_thumbnail = ImageSpecField(source='img', format='JPEG', processors=[ResizeToFill(100,100)], options={'quality': 50}) 20 register_time = models.DateTimeField(auto_now_add=True) 21 is_public = models.BooleanField(default=True) 22 23 def __str__(self): 24 return self.quiz_name
quiz_list.html
Python
1<a href="{% url 'quiz:question' question.id %}">Random Questions</a>
question.html
Python
1<h1>Question Setting</h1> 2 3<button class="btn btn-secondary"> 4 <a href="{% url 'quiz:selected_quiz' question.pk %}">START</a> 5</button>
selected_quiz.html
Python
1<h1>Quiz Name</h1> 2<h1>{{ quiz.quiz_name }}</h1> 3<h5>{{ quiz.quiz_difficulty }}</h5> 4 5<img src="{{ quiz.quiz_img.url }}" alt="img">
試したこと
○views.py
・直接カテゴリーIDを指定してみる。
context['quiz'] = random.choice(QuizInfo.objects.filter(quiz_category_id=3))←カテゴリーID2のカテゴリーからページ遷移していくとカテゴリーID3の問題が出題されることがわかりました。
ID3のカテゴリーから遷移していくと404のままでした。
・printでcontext['quiz']を出力してみる
カテゴリーIDごとに正しく値が入っていました。
○question.html
・question.pkを出力してみる
→選択したカテゴリーIDがquestion.pkに入っていました。
○直接アクセス
直接URLにアクセス
http://localhost:8000/quiz/2/selected_quiz/→成功
http://localhost:8000/quiz/3/selected_quiz/→404
補足情報(FW/ツールのバージョンなど)
Django2.1
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/11/21 02:56
2018/11/21 03:10 編集
2018/11/21 04:37
2018/11/21 06:45