В вашем шаблоне вы пишете:
<!-- this will iterate again over the <i>same</i> list -->
{% for keyword in <b>object_list.all</b> %}
<p>{{ keyword }}</p>
{% endfor %}
Но здесь object_list
это ваши QuerySet
статей.Тот факт, что вы вызываете .all()
, только означает, что цикл for
будет, таким образом, снова повторяться по всем PostModel
с (ну, .all()
используется, чтобы явно указать, что вы не выполняете фильтрацию).
Если вы хотите перебрать post_keyconcept
, вам нужно вместо этого позвонить posts.post_keyconcept.all
:
{% for keyword in <b>posts.post_keyconcept.all</b> %}
<p>{{ keyword }}</p>
{% endfor %}
, так как вы хотите отобразить key_concepts
всех posts
лучше использовать .prefetch_related(..)
в ListView
, чтобы keywords
выбиралось в постоянном количестве запросов, поэтому:
class ListPostGDV(ListView):
model = PostModel
queryset = PostModel.objects<b>.prefetch_related('post_keyconcept')</b>
# ...
Примечание : обычноназвания моделей единичны и без суффикса Model
, поэтому Post
вместо PostModel
и KeyConcept
вместо KeyConceptModel
.
Примечание : поскольку вы итерируете по object_list
(во внешнем цикле), элемент представляет собой отдельный пост, поэтому я советую назвать его post
вместо posts
, поскольку это только в противном случаевносит путаницу.
Примечание : все атрибуты начинаются с префикса post_
, который немного избыточен.Это также предотвращает использование утки, набирающей , когда, например, две модели имеют атрибут name
, и вы хотите, чтобы функция могла обрабатывать обе.Поэтому я советую удалить префикс post_
атрибутов.