Список_объектов не показывает правильный шаблон
У меня есть проект Django, в котором пользователи могут задавать вопросы и получать ответы. У меня есть три модели: Вопрос, Ответ и Комментарий. Я не знаю, почему шаблон комментария не показывает правильные данные, я не знаю, где найти данные комментария: object.comment, object.comment_set.all или что-то еще.
У меня была такая же проблема с получением данных ответа, но я успешно решил ее, используя '{% for answer in object.answer_set.all %}', но этот же метод не применяется в комментарии. Я заметил, что не понимаю, где все эти информационные стеки, которые нужно получить
Я относительно новичок в Django, поэтому буду благодарен за ответы с описанием, почему так происходит, чтобы избежать этого в проектах fitire.
models.py
class Question(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True)
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)
user = models.ForeignKey(User, on_delete=models.CASCADE, blank=True, null=True)
detail = models.TextField()
date_posted = models.DateTimeField(default=timezone.now)
def __str__(self):
return self.detail
class Comment(models.Model):
answer = models.ForeignKey(Answer, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='comment_user')
detail = models.TextField(default='')
date_posted = models.DateTimeField(default=timezone.now)
views.py
class AnswerView(ListView):
model = Answer
template_name = 'forum/detail.html'
class CommentView(ListView):
model = Comment
template_name = 'forum/detail.html'
detail.html
<div class="col-11">
{% for answer in object.answer_set.all %}
<p>{{ answer.detail }}</p>
<p><a href="#" class="mr-3">{{ answer.user.username }}</a>
<span>5 комментариев</span></p>
{% endfor %}
</div>
<!-- Comment Section Starts-->
<h3 class="my-4">Комментарии:</h3>
{% for comment in comment.answer.all %}
<div class="card mb-3">
<div class="card-body">
<p>{{ comment.detail }}</p>
<p><a href="#">{{ comment.user.username }}</a></p>
</div>
</div>
{% endfor %}
Ваши комментарии связаны с ответами отношением "многие к одному", поэтому вы можете получить их так же, как и ответы из вопросов - вам просто нужно сделать это в рамках вложенного цикла, т.е.
{% for answer in object.answer_set.all %
// your answer template stuff
{% for comment in answer.comment_set.all %}
// your comment template stuff
{% endfor %}
{% endfor %}
вам нужно использовать object_list
в вашем шаблоне в документации ListView написано
<div class="col-11">
{% for answer in object_list %} <!-- change to object_list-->
<p>{{ answer.detail }}</p>
<p><a href="#" class="mr-3">{{ answer.user.username }}</a>
<span>5 комментариев</span></p>
{% endfor %}
</div>
если нужно/хочется изменить имя переменной object_list
, вы можете определить context_object_name
в представлении.