Django中的类别递归

2 投票
2 回答
1244 浏览
提问于 2025-04-16 18:37

我一直在到处寻找这个问题的解决办法,但似乎找不到一个优雅的方式。简单来说,我有一个分类模型,这个模型有一个分类字段,用来表示一本书属于哪个分类,还有一个父分类字段。

我想创建一个模板来展示:

父分类1

  • 分类1
  • -- 书籍A
  • -- 书籍B
  • 分类2
  • -- 书籍B
  • -- 书籍C

父分类2

  • 分类3
  • -- 书籍B
  • -- 书籍D

我的模型是:

class Category(models.Model):
        category = models.CharField(max_length=20)
        parent = TreeForeignKey('self', blank=True, null=True, related_name='children')
class Book(models.Model):
        bookname=models.CharField(_('bookname'), max_length=255)
        author=models.CharField(_('author'), max_length=255)
        manufacturer=models.CharField(_('manufacturer'), max_length=255)
        description=models.TextField(_('description'), blank=True)
        coverart = models.ImageField(upload_to="coverart", blank=True, null=True)
        adder=models.ForeignKey(User, related_name="added_models", verbose_name=_('adder'))
        added=models.DateTimeField(_('added'), default=datetime.now)
        category=models.ForeignKey(Category, related_name='cat')
        content=models.TextField(blank=True)

有没有什么好的方法可以在我的视图/模板中实现这个?这只是一个基本的数据库浏览结构,但反向查找属于某个父分类的分类和书籍让我感到困惑。

2 个回答

2

试着使用django mptt这个工具,它可以帮助你在数据库中创建树形结构,非常实用。

它还提供了一些模板标签,帮助你生成HTML代码。

2
<ul>
{% for parent in categories %}
    <li>{{ parent.category }}
        <ul>
        {% for category in parent.children.all %}
        <li>{{ category.category }}
            <ul>
            {% for book in category.book_set.all %}
                <li>{{ book.bookname }}</li>
            {% endfor %}
            </ul>
        </li>
        {% endfor %}
        </ul>
    </li>
{% endfor %}
</ul>

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

撰写回答