Создать страницу контента - отфильтровать набор запросов по внешнему ключу и вывести результат в шаблоны Django -

Пытаемся отобразить эту структуру (древовидную структуру):

Book_1
 Book_1's Chapters
Book_2
 Book_2's Chapters

конкретный пример:

book:To Kill a Mockingbird
 itschapter:Chapter 1 - The Beginning of the Finch's
 itschapter:Chapter 2 - The Adventures of Education
 ...
book:The Sweet Hereafter
 itschapter:Chapter 1 - Dolores Driscoll
 itschapter:Chapter 2 - Billy Ansel
 ...

У меня есть две модели (таблицы) Django, предназначенные именно для этого:

две таблицы со столбцами id и name.

# myApp/models.py
from django.db import models

# books table #
class books_DB(models.Model):
  #pk is book_id
  book_id = models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')
  book_name = models.CharField(max_length=100)

# chapters table #
class chapters_DB(models.Model):
  #pk is chapter_id
  chapter_id = models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')
  #foreign key 'book_id' from 'books_DB' 
  book_id = models.ForeignKey(textbooks_DB, on_delete=models.CASCADE, default=None)
  chapter_name = models.CharField(max_length=100)

Я проверил, как получить эту структуру в оболочке python

from .models import *

for x in books_DB.objects.all():
 print(x.book_name)
 for y in x.chapters_db_set.all():
   print(' ' + y.chapter_name)
To Kill a Mockingbird
 The Beginning of the Finch's
 The Adventures of Education
The Sweet Hereafter
 Dolores Driscoll
 Billy Ansel

Теперь я хочу вывести результат на такую страницу

<ul class="books">

 <li class="book">To Kill a Mockingbird</li>
   <ol class="chapters">
      <li class="chapter">The Beginning of the Finch's</li>
      <li class="chapter">The Adventures of Education</li>
   </ol>

 <li class="book">The Sweet Hereafter</li>
   <ol class="chapters">
      <li class="chapter">Dolores Driscoll</li>
      <li class="chapter">Billy Ansel</li>
   </ol>

</ul>

Я пытался

<ul class="books">

    <!-- all_books is books_DB.objects.all() -->
    {% for x in all_books %}
    <li class="book">{{ x.book_name }}</li>
    <ol class="chapters">
        {% for y in x.chapter_db_set.all %}
            <li class="chapter">{{ y.chapter_name }}</li>
        {% endfor %}
    </ol>
    {% endfor %}

</ul>

что дает

book:To Kill a Mockingbird
book:The Sweet Hereafter

поэтому внутренний цикл for для глав ничего не возвращает

        {% for y in x.chapter_db_set.all %}
            <li class="chapter">{{ y.chapter_name }}</li>
        {% endfor %}

но я никак не могу понять, как использовать _set.all() в шаблоне в тегах {% %} и нужно ли это делать. Или даже как правильно передать данные, отфильтрованные в views.py, на страницу в этом сценарии.

ОТРЕДАКТИРОВАНО - ЗАБУДЬТЕ ПРЕДЫДУЩЕЕ

Ваша html-структура кажется немного неправильной.

должно быть так:

<ul>
    <li>
        <p>First numbered Item</p>
        <ol>
            <li>one thing</li>
            <li>two things</li>
            <li>three things</li>
        </ol>
    </li>
    <li>
        <p>Second numbered Item</p>
        <ol>
            <li>one thing</li>
            <li>two things</li>
            <li>Three things</li>
        </ol>
    </li>
</ul>

так внутренний тег ol является частью внешнего тега li

try

<ul class="books">

    <!-- all_books is books_DB.objects.all() -->
    {% for x in all_books %}
    <li class="book">
    <p>{{ x.book_name }}</p>
    <ol class="chapters">
        {% for y in x.chapter_db_set.all %}
            <li class="chapter">{{ y.chapter_name }}</li>
        {% endfor %}
    </ol>
    {% endfor %}
    </li>
</ul>
Вернуться на верх