我正在编写一个用户可以提问的网站。我不明白我的代码中有什么问题,但当我试图显示某个问题的所有答案时,屏幕上什么都没有显示。我试着使用所有东西:带过滤器的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((