django-cms默认菜单扩展菜单还是CMSAttachMenu?

时间:2014-05-23 22:38:50

标签: python django django-cms

我正在尝试使用django-cms构建一个非常简单的wiki类型的站点。

我有1个应用,定义了2个模型:

class Subject(models.Model):
    label=models.CharField

class Topic(models.Model):
    ...
    cat = models.ForeignKey('topics.Category',
    blank=True,
    default=None,
    help_text=u'Please choose a category for this topic',
    null=True
)

我试图让默认菜单将Subject类显示为顶级选项,将Topic类作为每个Subject的子级别。共有4个科目。 E.g:

主题1

-topic1

-topic2

主题2

-topic3

-topic4

等。

我已经阅读了所有django-cms文档,我仍然感到困惑。在我的menu.py中,我应该扩展Menu还是CMSAttachMenu?我需要4种不同的发电机吗?使用生成器时如何引用ForeignKey字段?

我是初学者,非常感谢任何帮助

1 个答案:

答案 0 :(得分:0)

你可以这样做:

# menu.py

from django.core.urlresolvers import reverse
from django.utils.translation import ugettext_lazy as _

from cms.menu_bases import CMSAttachMenu
from menus.base import NavigationNode
from menus.menu_pool import menu_pool

from .models import Subject


class SubjectsMenu(CMSAttachMenu):
    name = _("Subjects Menu")

    def get_nodes(self, request):
        nodes = []
        cnt = 0
        for subject in Subjects.objects.all():
            subject_node_id = cnt
            node = NavigationNode(
                subject.label,
                reverse('subject_view_detail', args=(subject.pk,)),
                subject_node_id
            )
            nodes.append(node)
            for topic in subject.topics.all():
                cnt += 1
                node = NavigationNode(
                    topic.name,
                    reverse('topic_view_detail', args=(topic.pk,)),
                    cnt,
                    subject_node_id  # parent
                )
                nodes.append(node)
            cnt += 1
        return nodes

menu_pool.register_menu(SubjectsMenu)

然后,您可以将此菜单添加到AppHook或从管理员附加。