2016-08-04 8 views
0

DjangoCMSのデフォルトNavigationNodeはのようにノードがあります。DjangoCMS NavigationNodeカスタムノード

  • 子供を
  • タイトル
  • get_menu_title
  • などGET_ATTRIBUTE
  • 同じで

コンテキスト、私は私のカスタムノードを追加したい:カテゴリ _ 文字列「何か」(テスト目的のためだけ)を返す。

official documentationに続いて、私の問題解決に役立つものは見つかりませんでした。デフォルトNavigationNodeの宣言に見上げたとき、次のコードが表示されます。menus.base輸入NavigationNodeから

base.pyファイル:

class NavigationNode(object): 

    def __init__(self, title, url, id, parent_id=None, parent_namespace=None, 
       attr=None, visible=True): 
     self.children = [] # do not touch 
     self.parent = None # do not touch, code depends on this 
     self.namespace = None # TODO: Assert why we need this and above 
     self.title = title 
     self.url = url 
     self.id = id 
     self.parent_id = parent_id 
     self.parent_namespace = parent_namespace 
     self.visible = visible 
     self.attr = attr or {} # To avoid declaring a dict in defaults... 

    def __repr__(self): 
     return "<Navigation Node: %s>" % smart_str(self.title) 

    def get_menu_title(self): 
     return self.title 

    def get_absolute_url(self): 
     return self.url 

    def get_attribute(self, name): 
     return self.attr.get(name, None) 

    def get_descendants(self): 
     return sum(([node] + node.get_descendants() for node in self.children), []) 

    def get_ancestors(self): 
     if getattr(self, 'parent', None): 
      return [self.parent] + self.parent.get_ancestors() 
     else: 
      return [] 

私が追加した場合私のカスタムノードはここでcategory_nameと呼ばれ、動作します。しかし、それはベースファイルを修正するスマートな解決策ではありません。

だから私の質問は次のとおりです。

base.py外に私のカスタム・ノードを追加する方法は? i.E.私が を私のアプリのmodels.pyファイルに追加したいのであれば。これも可能ですか?

答えて

0

最終的に解決策が見つかりました。答えは:はい!可能です。

ドキュメントに記載されているように、modify()メソッドを使用できます。

しかし私はnode.attr["changed_by"]と混同していたので、私にとってはうまくいかなかった。テンプレートでは、私はこのようなものを使用したかった:{{ child.category_name }}しかし、明らかなように、私はそれを間違って修正していた。

正しい方法はこれです:今

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.category_name = "Some category name here" 
     return nodes 

menu_pool.register_modifier(MyMode) 

、menu.htmlに、あなたはchild.category_nameを使用することができ、それが "ここにいくつかのカテゴリ名を" 出力文字列最後に

{% load i18n menu_tags cache %} 

{% for child in children %} 
<li> 
    {% if child.children %} 
    <a href="{{ child.get_absolute_url }}"> 
     {{ child.get_menu_title }} <span class="caret"></span> 
    </a> 
    <ul class="menu-vertical"> 
     {% show_menu from_level to_level extra_inactive extra_active template "" "" child %} 
    </ul> 
    {% else %} 
     <a class1="{{ child.get_absolute_url }}" href="{{ child.get_absolute_url }}"> 
      {% if child.category_name %} 
       <b>{{ child.category }}</b> 
      {% endif %} 
      {{ child.get_menu_title }} 
     </a> 
    {% endif %} 
</li> 
{% if class and forloop.last and not forloop.parentloop %}{% endif %} 
{% endfor %} 

ます時間と数時間の試行の後、私はこれを解決しました。

関連する問題