0
votes

Obtenir le nombre de commentaires d'un article spécifique dans django

J'ai un petit problème avec une requête. Je travaille sur un site de blog avec django. Pour les articles, j'ai la première page où j'affiche tous les articles sous forme de liste, avec leurs détails (titre, date de publication, etc.) et je veux afficher le nombre de commentaires pour chaque article avec le titre, la date de publication et les balises. Je ne sais pas comment faire cela, je dois implémenter quelque chose sur les classes de modèle ou dans la fonction d'affichage qui rend la page? Voici les classes modèles.

def blog(request):

    context = {
        'posts': Post.objects.all(),
        'title': 'Blog',
        'banner_page_title': 'Blog',
        'page_location': 'Home / Blog'
    }
    return render(request, 'blog/blog.html', context)

et la fonction d'affichage

class Post(models.Model):
    author = models.ForeignKey(
        settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=500)
    content = models.TextField()
    tags = models.CharField(max_length=100)
    date_posted = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return self.title


class Comment(models.Model):
    user = models.ForeignKey(settings.AUTH_USER_MODEL,
                             on_delete=models.CASCADE)
    post = models.ForeignKey(Post, on_delete=models.CASCADE)
    comment_text = models.TextField()
    date_posted = models.DateTimeField(default=timezone.now)

    def __str__(self):
        return f'{self.user.username} Comment ' + str(self.id)


0 commentaires

3 Réponses :


0
votes

Utilisez une recherche inversée dans le modèle et count pour obtenir le nombre d'objets associés:

{{ post.comment_set.count }}


0 commentaires

0
votes

Quelque chose comme ça?

template.html

...
{% for post in posts %}
  <div> Title: {{post.title}} </div>
  <div> Date Posted: {{post.date_posted}} </div>
  <div> Number of Comments: {{post.comment_set.count}} </div>
{% endfor %}


0 commentaires

0
votes

Méthode 1:

Vous pouvez l'utiliser dans votre modèle.

{% for post in posts %}
    {{ post.comment_count }}
{% endfor %}

Méthode 2:

Vous pouvez implémenter une méthode modèle comme celle-ci:

class Post(models.Model):
    ....
    def __str__(self):
        return self.title

    @property
    def comment_count(self):
        return self.comment_set.count()

Et vous pouvez appeler la méthode du modèle dans votre modèle comme ceci:

{% for post in posts %}
    {{ post.comment_set.count }}
{% endfor %}

0 commentaires