I am building a category and subcategory tree for my eCommerce website. Category model has a TreeForeignKey to itself so that categories can have many other subcategories as children. In my product.html route, I successfully rendered the categories tree with {& recursetree [models] &} tag (see first image below). When the user clicks on say the "Pumps" link, the user will be brought to another page that shows "Pumps" and its subcategories only. However, when i tried to replicate the same thing with {& recursetree [models] &}, it did not work out. I only see "Pumps" parent and none of its children subcategories. I've made sure that i passed in a treequeryset into the recursetree tag so that i dont run into "object not subscriptable error". However, i have hit a roadblock and do not know what is wrong with my code.
models.py
from django.db import models
from mptt.models import MPTTModel, TreeForeignKey, TreeManyToManyField
from ckeditor_uploader.fields import RichTextUploadingField
from django.urls import reverse
# Create your models here.
class Category(MPTTModel):
Status = (
('True', 'True'),
('False', 'False'),
)
bool_choices = (
(True, 'Yes'),
(False, 'No'),
)
parent = TreeForeignKey('self', blank = True, null = True, related_name = 'children', on_delete=models.CASCADE)
name = models.CharField(max_length=50)
slug = models.SlugField(unique=True, null=False)
description = models.TextField()
status = models.CharField(max_length=10, choices = Status)
is_active = models.BooleanField(choices=bool_choices)
meta_keywords = models.CharField(max_length=255)
meta_description = models.CharField(max_length=255)
created_at = models.DateTimeField(auto_now_add = True)
updated_at = models.DateTimeField(auto_now = True)
image = models.ImageField(blank = True, upload_to = 'images/')
class Meta:
db_table = 'categories'
verbose_name_plural = 'Categories'
def __str__(self):
return f"{self.name}"
class MPTTMeta:
order_insertion_by = ['name']
def get_absolute_url(self):
return reverse('category_detail', kwargs={'slug':self.slug})
views.py
def product(request):
category = Category.objects.all()
context = {'category': category}
return render(request, 'product.html', context)
def category(request, slug):
category = Category.objects.all().filter(slug=slug)
context = {'category': category}
return render(request, 'category.html', context)
urls.py
from django.urls import path
from . import views
from django.conf.urls.static import static
from django.conf import settings
urlpatterns = [
path("product/", views.product, name='product'),
path("<str:slug>/", views.category, name='category'),
]+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
product.html
{% extends 'layout.html' %}
{% block title %}
{% endblock %}
{% block body %}
<div>
{% load mptt_tags %}
<div class = "container">
<ul class="root">
{% recursetree category %}
<li>
<a href="{% url 'category' node.slug %}">{{ node.name }}</a>
{% if not node.is_leaf_node %}
<ul class="children">
{{ children }}
</ul>
{% endif %}
</li>
{% endrecursetree %}
</ul>
</div>
</div>
{% endblock %}
[Categories and its subcategories successfully rendered in product.html] [1]: https://i.stack.imgur.com/WO2ZH.png
category.html
{% extends 'layout.html' %}
{% block title %}
{{ category.id }}
{% endblock %}
{% block body %}
{% load mptt_tags %}
<div class = "container">
<ul class="root">
{% recursetree category %}
<li>
<a href="{% url 'category' node.slug %}">{{ node.name }}</a>
{% if not node.is_leaf_node %}
<ul class="children">
{{ children }}
</ul>
{% endif %}
</li>
{% endrecursetree %}
</ul>
</div>
{% endblock %}
[Pumps' subcategories failed to render in the category.html] [2]: https://i.stack.imgur.com/6DRkQ.png