@ayasaka

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

djangoで掲示板作成時、特定のテーマに対するコメントを表示させたいのだが、エラーが出てしまいます。

解決したいこと

djangoで掲示板作成時、特定のテーマに対するコメントを表示させたいのだが、エラーが出てしまう。

発生している問題・エラー


[02/Aug/2022 15:28:56] "GET /boards/post_comments/10 HTTP/1.1" 500 85551
<WSGIRequest: GET '/boards/post_comments/10'>
Internal Server Error: /boards/post_comments/10
Traceback (most recent call last):
  File "C:\Users\aruka\anaconda3\envs\djangoenv\lib\site-packages\django\core\handlers\exception.py", line 47, in inner
    response = get_response(request)
  File "C:\Users\aruka\anaconda3\envs\djangoenv\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\aruka\anaconda3\envs\djangoenv\lib\site-packages\django\views\generic\base.py", line 69, in view
    return self.dispatch(request, *args, **kwargs)
  File "C:\Users\aruka\anaconda3\envs\djangoenv\lib\site-packages\django\views\generic\base.py", line 101, in dispatch
    return handler(request, *args, **kwargs)
  File "C:\Users\aruka\anaconda3\envs\djangoenv\lib\site-packages\django\views\generic\edit.py", line 170, in get
    return super().get(request, *args, **kwargs)
  File "C:\Users\aruka\anaconda3\envs\djangoenv\lib\site-packages\django\views\generic\edit.py", line 135, in get
    return self.render_to_response(self.get_context_data())
  File "C:\Users\aruka\OneDrive\デスクトップ\django_exam\FunctionExam\function_project\boards\views.py", line 51, in get_context_data
    context['comments'] = Comments.objects.filter(theme_id=self.pk).order_by('id').all()
AttributeError: 'PostCommentsView' object has no attribute 'pk'
[02/Aug/2022 15:32:24] "GET /boards/post_comments/10 HTTP/1.1" 500 85551

該当するソースコード

from django.shortcuts import render, get_object_or_404
from django.urls import reverse_lazy
from django.views.generic.list import ListView
from django.views.generic.edit import CreateView, UpdateView, DeleteView
from .models import Themes, Comments
from .forms import CreateThemeForm, PostCommentsForm
from django.http import Http404
from django.contrib.auth.mixins import LoginRequiredMixin
import os

class CreateThemeView(LoginRequiredMixin, CreateView):
    template_name = os.path.join('boards', 'create_theme.html')
    form_class = CreateThemeForm
    model = Themes

    def form_valid(self, form):
        form.instance.user = self.request.user
        form.save()
        return super().form_valid(form)

class ListThemeView(ListView):
    model = Themes
    template_name = os.path.join('boards', 'list_themes.html')

class UpdateThemeView(LoginRequiredMixin, UpdateView):
    model = Themes
    template_name = os.path.join('boards', 'edit_theme.html')
    form_class = CreateThemeForm

class DeleteThemeView(LoginRequiredMixin, DeleteView):
    model = Themes
    template_name = os.path.join('boards', 'delete_theme.html')
    success_url = reverse_lazy('boards:list_themes')

class PostCommentsView(CreateView):
    model = Comments
    template_name = os.path.join('boards', 'post_comments.html')
    form_class = PostCommentsForm

    def get_success_url(self):
        return reverse_lazy('boards:post_comments', kwargs={'pk': self.object.id })

    def form_valid(self, form):
        form.instance.theme = Themes.objects.get(user_id=self.request.user.id)
        form.instance.user = self.request.user
        return super().form_valid(form)

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        print(self.request)
        context['comments'] = Comments.objects.filter(theme_id=self.pk).order_by('id').all()
        return context

自分で試したこと

get_context_dataで値をテンプレートに渡すときに、urlディスパッチで
もらう値を使うためにself.request.idやself.pkといったことを使ってみたが、エラーが出てしまった。
get_context_dataでurlディスパッチを取り出す方法を教えてもらいたいです。

0 likes

1Answer

Comments.objects.filter(theme_id=self.kwargs.get('id')).order_by('id')

でどうでしょうか?

0Like

Comments

  1. @ayasaka

    Questioner

    ありがとうございます。試して見ます。

Your answer might help someone💌