如何显示基于特定问题Django的答案



我正在编写一个用户可以提问的网站。我不明白我的代码中有什么问题,但当我试图显示某个问题的所有答案时,屏幕上什么都没有显示。我试着使用所有东西:带过滤器的QuerySet、get、使用id,但都不起作用。似乎有两个问题:Django不明白要显示什么答案,或者我的模板不正确。这是代码:

型号.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

顺便说一句,因为它总是得到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((

最新更新