Похоже, что вы пытаетесь достичь sh, чтобы создать древовидную структуру для ваших категорий и подкатегорий. Есть пара инструментов, которые помогут сделать это намного более управляемым в Django. Я потратил немало времени, пытаясь реализовать что-то в этом духе, и в конечном итоге нашел эти инструменты, чтобы сэкономить много времени и разочарований.
Похоже, что два, которые поднимаются на вершину для этой цели, Django -mptt и Django -treebeard . Оба весьма полезны, хотя и с разными сильными и слабыми сторонами. Для меня я обычно предпочитал работать с Django -mptt, потому что я нашел документацию более тщательной.
Пример того, что вы можете сделать с помощью mptt:
models.py
...
from mptt.models import MPTTModel, TreeForeignKey
class Product(models.Model):
title = models.CharField(max_length=120)
slug = models.SlugField(unique=True)
description = models.TextField(blank=True,null=True)
category = models.ForeignKey(
'Category',
related_name="products",
on_delete=models.CASCADE
)
def save(self, *args, **kwargs):
self.slug = slugify(self.title)
super(Product,self).save(*args, **kwargs)
def get_absolute_url(self):
return self.slug
class Category(MPTTModel):
name = models.CharField(max_length=200)
slug = models.SlugField(unique=True)
parent = models.TreeForeignKey(
'self',
blank=True,
null=True,
related_name='child',
on_delete=models.CASCADE
)
class Meta:
unique_together = ('slug', 'parent',)
verbose_name_plural = "categories"
def __str__(self):
full_path = [self.name]
k = self.parent
while k is not None:
full_path.append(k.name)
k = k.parent
return ' -> '.join(full_path[::-1])
views.py
...
def index(request):
if request.method == 'GET':
category_id = int(request.GET.get('category_id', default=1))
current_category = Category.objects.get(pk=category_id)
children = current_category.get_children()
ancestors = current_category.get_ancestors()
products = current_category.products.all()
context = {
'categories': children,
'current_category': current_category,
'ancestors': ancestors,
'products': products,
}
return render(request, 'your_site/index.html', context)
Надеемся, что, посмотрев на индексное представление, вы сможете понять, насколько удобен этот дополнительный контекст, когда вы пишете шаблон для отображения этой информации. Это очень простой пример, но он должен дать некоторые идеи.