Не могу отобразить количество комментариев - PullRequest
1 голос
/ 28 мая 2020

Я хочу отображать количество комментариев (количество) на главной (индексной) странице статей. У меня есть две модели: комментарии , сообщение и просмотры post_detail , post_list .

models.py

class Post(models.Model):

    title = models.CharField(max_length=200, unique=True,  db_index=True )
    slug = models.SlugField(max_length=200, unique=True, )

    def get_absolute_url(self):
        return self.slug

class Comment(models.Model):

  post=models.ForeignKey(Post,  on_delete=models.CASCADE)
  content= models.TextField(max_length=160)
  timestamp = models.DateTimeField(auto_now_add=True)


views.py

def post_detail(request, slug):

  post = get_object_or_404(Post, slug=slug)
  comments = Comment.objects.filter(post=post).order_by('id')

  return render(request, {'post': post, 'comments':comments, })
class PostList(generic.ListView):

    queryset = Post.objects.filter(status=1).order_by('-created_on')
    template_name = 'index.html'
    paginate_by = 6

На страница статьи (post_detail), используя тег {{comments.count}} - количество успешно полученных мной комментариев. Но пытаясь получить количество комментариев к постам на индексной странице (postList), ничего не выходит. Попробовал {{post.comments.count}} - ничего не вышло.

Ответы [ 2 ]

2 голосов
/ 28 мая 2020

Поскольку вы не указали значение для параметра related_name=… [Django -doc] , соответствующий менеджер для получения комментариев от объекта Post comment_set. Таким образом, вы можете получить доступ к количеству комментариев с помощью:

{{ post<b>.comment_set</b>.count }}

Но это не эффективно. Это означает, что для каждые Post, которые вы здесь визуализируете, вы будете делать дополнительный запрос. Лучше аннотировать это в представлении:

from django.db.models import <b>Count</b>

class PostList(generic.ListView):
    queryset = Post.objects.annotate(
        <b>ncomment=Count('comment')</b>
    ).filter(status=1).order_by('-created_on')
    template_name = 'index.html'
    paginate_by = 6

Объекты Post, возникающие из этого набора запросов, будут иметь дополнительный атрибут .ncomment, который содержит количество комментариев, поэтому вы можно отобразить это с помощью:

{{ post<b>.ncomment</b> }}
0 голосов
/ 28 мая 2020

Я не эксперт в этой структуре, но не можете ли вы просто отправить обратно другое свойство, которое сообщает вам длину массива комментариев, которая должна быть количеством комментариев, например?

...