django:儿童类别及其父母

时间:2011-02-28 18:32:08

标签: django

我建立了一个网站,按类别和子(子)类别对产品进行分类。

这些是我的模特:

class Category(models.Model):
    name = models.CharField(max_length=250)
    parent = models.ForeignKey('self', related_name='children')
    ...

class Product(models.Model):
    category = models.ForeignKey(Category)
    name = models.CharField(max_length=250)
    ...

在呈现类别的视图中,我有:

def some_view(request, category):
    category_list = Category.objects.filter(parent__isnull=True)
    product_list = Product.objects.filter(category=category)

我的模板正确显示了所有内容:

<ul>
    {% for category in category_list %}
    <li>
        <a href="{{ category.get_absolute_url }}">{{ category.name }}</a>
        <ul>
            {% for child in category.children.all %}
            <li><a href="{{ child.get_absolute_url }}">{{ child.name }}</a></li>
            {% endfor %}
        </ul>
    </li>
    {% endfor %}
</ul>

我可以成功显示类别及其子项。我的问题是我使用子类别来进一步过滤产品,但它们也应该属于主要类别。例如:

Books
--- Comics
--- Sci-Fi
--- ...
Music
--- Classical
--- Pop
--- ...

如果我在“图书&gt;漫画”中对产品进行分类,如果我在模板的类别列表中选择“漫画”,我会获得该产品。但是,选择“图书”也应该列出该产品,因为它是顶级类别,但除非我将它们归类为父类“书籍”,否则它不会显示任何产品。 我不确定如何以更好的方式解释这一点,但我基本上希望能够显示属于子类别的所有产品,但是当我选择主要类别时,该产品也应该存在,并且我似乎无法使其发挥作用。有什么建议吗?

1 个答案:

答案 0 :(得分:1)

脱离我的头顶,最简单的实施方式是,

将外键从产品更改为类别到多对多,然后覆盖模型保存,以便自动将父类别分配给每个类别的产品。

但更好的解决方案是(我读你的评论,我仍然这么说),实施django-mptt并使用南[http://south.aeracode.org/docs/tutorial/part3.html]来处理datamigration。