2016-10-14 2 views
0

Je crée un nouveau champ pour la page d'extension de la page, je suis le documentation pour cela.Extension de la page Avec les menus

Alors maintenant chaque page a une image. Dans mon cas, je montre le sous-menu dans mon modèle en utilisant ce

{% show_menu 2 100 100 100 "partials/menu_image.html" %} 

donc dans mon menu_image.html je montre mon menu comme celui-ci

<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> 

Mon problème est que ici, je veux montrer l'image de chaque la page ici dans le menu, pour que je dois créer un cms_menus.py donc j'ai cette

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) 

dans ce point que j'ai un peu confus, Beca utiliser Je ne sais pas comment communiquer avec mon menu pour afficher l'image ici et le documentation dans ce point est pas clair

où je dois utiliser extension = page.iconextension et child.extension.icon une idée ou un exemple pour voir

Merci à avance!

Répondre

1

J'ai fait face au même problème - vous voulez chercher l'objet d'extension de la page dans le modificateur de menu, voir mon exemple ci-dessous:

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) 

J'utilise le chargement paresseux pour assurer que je ne pas charger la page (et potentiellement frapper DB) à moins que le modèle le demande.

Dans le modèle de menu html, j'ai alors les suivantes:

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

Vous pouvez voir que je suis en utilisant une simple chaîne représentant la classe de l'élément de menu, mais vous pouvez utiliser un champ.