Создать страницу контента - отфильтровать набор запросов по внешнему ключу и вывести результат в шаблоны 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>