使用菜单扩展页面

Extending the page With menus

我为页面扩展页面创建了一个新字段,为此我遵循 documentation

所以现在每个页面都有一个图像。 在我的例子中,我使用 this

在我的模板中显示子菜单
{% show_menu 2 100 100 100 "partials/menu_image.html" %}

所以在我的 menu_image.html 中,我这样显示我的菜单

<ul>
  {% for child in children %}
    <li>
      <div class="project_item">
        <a href="{{ child.get_absolute_url }}">
        {% if request.current_page %}
          <img src="{% static request.current_page.iconextension.image.url %}">
        {% endif %}
        <div class="title_project">{{ child.get_menu_title }}</div>
        <div class="description_project"> 
          {{ request.current_page.PageDescriptionExtension.description_page }}
        </div>
        </a>
      </div>

    </li>
  {% endfor %}
</ul>

我的问题是我想在菜单中显示每个页面的图像,为此我必须创建一个 cms_menus.py 所以我有这个

from menus.base import Modifier
from menus.menu_pool import menu_pool
from cms.models import Page

class MyMode(Modifier):
    """
    """
    def modify(self, request, nodes, namespace, root_id, post_cut, breadcrumb):
        # if the menu is not yet cut, don't do anything
        if post_cut:
            return nodes
        # otherwise loop over the nodes
        for node in nodes:
            # does this node represent a Page?
            if node.attr["is_page"]:
                # if so, put its changed_by attribute on the node

                node.attr["changed_by"] = Page.objects.get(id=node.id).changed_by
        return nodes

menu_pool.register_modifier(MyMode)

在这一点上我有点困惑,因为我不知道如何将其与我的菜单进行通信以在此处显示图像并且documentation在这一点上不清楚

我必须使用 extension = page.iconextensionchild.extension.icon 的任何想法或示例

提前致谢!

我遇到了同样的问题 - 您想在菜单修饰符中获取页面的扩展对象,请参阅下面的示例:

from menus.base import Modifier
from menus.menu_pool import menu_pool
from raven.contrib.django.raven_compat.models import client

from cms.models import Page

class MenuModifier(Modifier):
    """
    Injects page object into menus to be able to access page icons
    """
    def modify(self, request, nodes, namespace, root_id, post_cut, breadcrumb):
        # if the menu is not yet cut, don't do anything
        if post_cut:
            return nodes

        for node in nodes:

            try: 
                if "is_page" in node.attr and node.attr["is_page"]:

                    class LazyPage(object):
                        id = node.id
                        page = None
                        def pagemenuiconextension(self):
                            try:
                                if not self.page:
                                    self.page = Page.objects.get(id=self.id)
                                return self.page.pagemenuiconextension
                            except AttributeError, ae:
                                # print ae
                                return False
                            except Exception, e:
                                print e
                                client.captureException()

                    node.pageobj = LazyPage()

                else:
                    pass
            except Exception, e:
                client.captureException()

        return nodes

menu_pool.register_modifier(MenuModifier)

我正在使用延迟加载来确保除非模板请求,否则我不会加载页面(并可能命中数据库)。

在菜单模板 html 中,我有以下内容:

<div class="{{ child.pageobj.pagemenuiconextension.menu_navicon }}" style="height: 16px;">{{ child.get_menu_title }}</div>

您可以看到我使用的是表示菜单项 class 的简单字符串,但您可以使用任何字段。