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)
3 Réponses :
Utilisez une recherche inversée dans le modèle et count
pour obtenir le nombre d'objets associés:
{{ post.comment_set.count }}
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 %}
Vous pouvez l'utiliser dans votre modèle.
{% for post in posts %} {{ post.comment_count }} {% endfor %}
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 %}