Django: Вложенный цикл for не работает должным образом
У нас есть две таблицы, которые имеют отношения "многие к одному".
в models.py :
class Author(models.Model):
name = models.CharField(max_length=100, null=False)
username = models.CharField(max_length=35, null=False)
def __str__(self):
return self.name
class Article(models.Model):
CATEGOTY = (
('programming', 'programming'),
('other', 'other')
)
title = models.CharField(max_length=100, null=False)
content = models.TextField(null=False)
category = models.CharField(max_length=100, choices=CATEGOTY, null=False)
creation = models.DateTimeField(auto_now_add=True)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
def __str__(self):
return self.title
and in views.py:
def articles(request):
authors = Author.objects.all()
articles = Article.objects.all()
totalArticles = articles.count()
authorAticles = Author.objects.annotate(numberOfArticles=Count('article'))
return render(request, 'articles/article.html', {
'articles' : articles,
'authors' : authors,
'totalArticles': totalArticles,
'authorAticles': authorAticles
})
и html-код:
<div class="container mb-3 p-3" id="author-aricle">
<div class="row">
<div class="col-sm">
totle articles: {{totalArticles}}
</div>
{% for author in authors %}
<div class="col-sm">
{{author}}:
{% for authorAticle in authorAticles %}
{{authorAticle.numberOfArticles}}
{% endfor %}
articles
</div>
{% endfor %}
</div>
</div>
Я хочу, чтобы html-вывод отображал количество статей каждого автора рядом с его именем. Это означает, сколько статей у каждого автора? Я хочу, чтобы html-вывод выглядел следующим образом:
автор1: 2 статьи
автор2: 3 статьи
автор3: 3 статьи
etc
но этого не происходит, и на выходе получается:
автор1: 3 3 2 статьи
автор2: 3 3 2 статьи
автор3: 3 3 2 статьи
Проблема в том, что authorAticles = Author.objects.annotate(numberOfArticles=Count('article'))
возвращает Авторов, а не Статьи, и не их количество.
Поэтому далее здесь:
{{author}}:
{% for authorAticle in authorAticles %}
Для каждого автора выполняется итерация по всем авторам.
Что-то вроде {{ author.article_set.count }}
должно работать, чтобы подсчитать их все для каждого автора.
Или, если вы предпочитаете использовать annotate, просто добавьте его в фильтрацию авторов:
authors = Author.objects.annotate(numberOfArticles=Count('article'))
и затем ссылаться на него в шаблоне:
{{ author }}:
{{ author.numberOfArticles }}