我建立了一个网站,按类别和子(子)类别对产品进行分类。
这些是我的模特:
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;漫画”中对产品进行分类,如果我在模板的类别列表中选择“漫画”,我会获得该产品。但是,选择“图书”也应该列出该产品,因为它是顶级类别,但除非我将它们归类为父类“书籍”,否则它不会显示任何产品。 我不确定如何以更好的方式解释这一点,但我基本上希望能够显示属于子类别的所有产品,但是当我选择主要类别时,该产品也应该存在,并且我似乎无法使其发挥作用。有什么建议吗?
答案 0 :(得分:1)
脱离我的头顶,最简单的实施方式是,
将外键从产品更改为类别到多对多,然后覆盖模型保存,以便自动将父类别分配给每个类别的产品。
但更好的解决方案是(我读你的评论,我仍然这么说),实施django-mptt并使用南[http://south.aeracode.org/docs/tutorial/part3.html]来处理datamigration。