Как показать ответы на основе определенного вопроса 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()