Create content page - filter queryset by foreignkey and render the result to Django templates -
Trying to render this structure (tree structure):
Book_1
Book_1's Chapters
Book_2
Book_2's Chapters
specific example:
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
...
I have two Django models (tables) for just that:
two tables with id and name columns.
# 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)
I tested how to get this structure in python shell
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
Now I wish to render the result to a page like this
<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>
I tried
<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>
which gives
book:To Kill a Mockingbird
book:The Sweet Hereafter
so the inner for loop for chapters returns nothing
{% for y in x.chapter_db_set.all %}
<li class="chapter">{{ y.chapter_name }}</li>
{% endfor %}
but I can't seem to figure out how to use _set.all() in a template within {% %} tags and should I. Or even how to pass data filtered in views.py to the page the right way in this scenario.
EDITED - FORGET PREVIOUS
your html structure seems a bit wrong.
it should be like this:
<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>
so inner ol tag is part of outer li tag
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>