4

アプリを Django CMS に統合したいと考えています。そのため、Django CMSのドキュメントに従いました。

例: アプリの menu.py で次のコード (doc から) を使用します。

from menus.base import Menu, NavigationNode
from menus.menu_pool import menu_pool
from django.utils.translation import ugettext_lazy as _

class TestMenu(Menu):

    def get_nodes(self, request):
        nodes = []
        n = NavigationNode(_('sample root page'), "/", 1)
        n2 = NavigationNode(_('sample settings page'), "/bye/", 2)
        n3 = NavigationNode(_('sample account page'), "/hello/", 3)
        n4 = NavigationNode(_('sample my profile page'), "/hello/world/", 4, 3)
        nodes.append(n)
        nodes.append(n2)
        nodes.append(n3)
        nodes.append(n4)
        return nodes

menu_pool.register_menu(TestMenu)

私の問題は、ノードの順序です。このコードを使用すると、cms ページのメニューにメニューが追加されますが、別の順序が必要です。

アプリ メニューが表示される位置を定義する方法はありますか?

4

2 に答える 2

3

これが私のこれまでの回避策です。(私はまだもっときれいな方法を好みます。)

名前の付いたCMSページを追加しました。--appname--これは私のmenu.py:です。

from menus.base import Menu, NavigationNode
from menus.base import Modifier
from menus.menu_pool import menu_pool

my_items = ["a", "b", "c"]

class ImmoMenu(Menu):

    def get_nodes(self, request):
        nodes = []

        i = 0

        for name in my_items:
            i += 1
            n = NavigationNode(name, "/", i, attr={'appname': True})
            nodes.append(n)

        return nodes

menu_pool.register_menu(ImmoMenu)


class ImmoModifier(Modifier):

    def modify(self, request, nodes, namespace, root_id, post_cut, breadcrumb):
        if post_cut is not True:
            return nodes

        split_passed = False

        nodes_before = []
        nodes_after = []
        nodes_immo = []

        for node in nodes:
            if node.title == "--appname--":
                split_passed = True
                continue

            if 'appname' in node.attr:
                nodes_immo.append(node)

            elif split_passed:
                nodes_after.append(node)

            else:
                nodes_before.append(node)

        return nodes_before + nodes_immo + nodes_after

menu_pool.register_modifier(ImmoModifier)
于 2012-06-02T09:11:59.250 に答える
0

助けてくれてありがとう、スヴェン!! 修飾語の存在を知りませんでした...

以下は、コードの改良です。任意の場所にアプリ ノードを挿入します。各アプリ ノードには targetIndex 属性があり、メニュー上でゼロから始まる場所番号を指定します。キャメルケースで申し訳ありませんが、私はプログラミング言語を組み合わせて、それらすべてに適合する 1 つのスタイルを使用しています。この例では、app ノードは偶数の場所に挿入されています。「follow」は私のアプリの名前です。

    from menus.base import Menu, NavigationNode, Modifier
    from menus.menu_pool import menu_pool

    class FollowMenu (Menu):
        def get_nodes (self, request):
            nodes = []
            for i in range (5):
                nodes.append (NavigationNode (('Test' + str (i)), '/', i,  attr={'targetIndex': 2 * i}))
            return nodes

    menu_pool.register_menu (FollowMenu)

    class FollowModifier (Modifier):
        def modify (self, request, nodes, namespace, root_id, post_cut, breadcrumb):
            if not post_cut:
                return nodes

            appNodes = [node for node in nodes if 'targetIndex' in node.attr]
            cmsNodes = [node for node in nodes if not 'targetIndex' in node.attr]

            resultNodes = []

            appNodeIndex = 0
            cmsNodeIndex = 0
            for resultNodeIndex in range (len (nodes)):
                if appNodeIndex < len (appNodes) and appNodes [appNodeIndex] .attr ['targetIndex'] == resultNodeIndex:
                    resultNodes.append (appNodes [appNodeIndex])
                    appNodeIndex += 1
                elif cmsNodeIndex < len (cmsNodes):
                    resultNodes.append (cmsNodes [cmsNodeIndex])
                    cmsNodeIndex += 1
                else:
                    raise Exception ('Error merging app menu and cms menu items')

            return resultNodes

    menu_pool.register_modifier (FollowModifier)
于 2012-08-05T12:29:33.850 に答える