Как показать ответы на основе определенного вопроса Django?

Я пишу сайт, на котором пользователи могут задавать вопросы. Я не понимаю, какая проблема в моем коде, но когда я пытаюсь показать все ответы на определенный вопрос - на экране ничего не появляется. Я пытался использовать все: QuerySet с фильтром, get, использование id, но ничего не работает. Похоже, что проблема в двух вещах: Django не понимает, какие ответы показывать, или мой шаблон неверен. Вот код:

models.py

class Question(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(max_length=250)
    slug = models.SlugField(max_length=255, unique=True, db_index=True,         verbose_name="URL")
    detail = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('detail', kwargs={'slug': self.slug})


class Answer(models.Model):
    question = models.ForeignKey(Question, on_delete=models.CASCADE)
    detail = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.detail

urls.py

    urlpatterns = [
    path('', QuestionView.as_view(), name='forum'),
    path('search/', SearchView.as_view(), name='search'),
    path('question/<slug:slug>/', QuestionDetailView.as_view(), name='detail'),
    path('answer/', AnswerView.as_view(), name='answer')
    ]

views.py

class QuestionView(ListView):
    model = Question
    template_name = 'forum/forum.html'
    context_object_name = 'questions'
    ordering = ['-date_posted']
    paginate_by = 1

class QuestionDetailView(DetailView):
    model = Question
    template_name = 'forum/detail.html'

class AnswerView(ListView):
    model = Answer
    template_name = 'forum/detail.html'
    context_object_name = 'answers'


    def get_queryset(self):
        quest = Question.objects.get(id=1)
        return Answer.objects.filter(question=quest)

templates/detail.html

{% for answer in answers %}
    <div class="col-11">
        <p>{{ answer.detail }}</p>
        <p><a href="#" class="mr-3">BigBossData</a><span>5 комментариев</span></p>
    </div>
{% endfor %}

Возможно, вам следует использовать прямое отношение.

quest = Question.objects.get(pk=1)
answers = quest.answer_set.all()
def get_queryset(self):
    quest = Question.objects.get(id=1)
    return Answer.objects.filter(question=quest)

Вместо использования id=1 используйте pk=1

Btw поскольку он всегда получает первый вопрос с pk=1, шаблон будет показывать только и всегда ответы на вопрос 1. Поскольку вы сказали "Я пытаюсь показать все ответы на определенный вопрос". Поэтому для этого вам нужны некоторые изменения.

URL:
    urlpatterns = [
    path('', QuestionView.as_view(), name='forum'),
    path('search/', SearchView.as_view(), name='search'),
    path('question/<slug:slug>/', QuestionDetailView.as_view(), name='detail'),
    **path('answer/<slug:slug>/', AnswerView.as_view(), name='answer')**
    ]

просмотров:

 class AnswerView(ListView):
     model = Answer
     template_name = 'forum/detail.html'
     context_object_name = 'answers'


    def get_queryset(self):
        **question_slug = self.kwargs['slug']
        quest = Question.objects.get(slug=question_slug) # this will give you the question object, whose answers you want to show
        return Answer.objects.filter(question=quest) # this will return all answers for the above question.**

Надеюсь, это поможет

Я решил эту проблему, добавив {% for answer in object.answer_set.all %} Также я удалил get_queryset()

Вернуться на верх