55from .utils import get_callable , parse_url
66
77if django .VERSION >= (1 , 10 ): # pragma: no cover
8- from django .urls import reverse , NoReverseMatch
8+ from django .urls import resolve , reverse , NoReverseMatch
99else :
10- from django .core .urlresolvers import reverse , NoReverseMatch
10+ from django .core .urlresolvers import resolve , reverse , NoReverseMatch
1111
1212
1313class MenuBase (object ):
@@ -83,12 +83,20 @@ def _get_related_urls(self, item_dict):
8383 related_urls = item_dict .get ('related_urls' , [])
8484 return [parse_url (url ) for url in related_urls ]
8585
86+ def _get_related_views (self , item_dict ):
87+ """
88+ Given a menu item dictionary, it returns the relateds viewss or an empty list.
89+ """
90+ related_views = item_dict .get ('related_views' , [])
91+ return related_views
92+
8693 def _is_selected (self , item_dict ):
8794 """
8895 Given a menu item dictionary, it returns true if `url` is on path,
8996 unless the item is marked as a root, in which case returns true if `url` is part of path.
9097
9198 If related URLS are given, it also returns true if one of the related URLS is part of path.
99+ If related views are given, it also returns true if the path maps to one of these views.
92100 """
93101 url = self ._get_url (item_dict )
94102 if self ._is_root (item_dict ) and url in self .path :
@@ -100,6 +108,9 @@ def _is_selected(self, item_dict):
100108 for related_url in self ._get_related_urls (item_dict ):
101109 if related_url in self .path :
102110 return True
111+ # Resolve URL and check if it relates to a related views
112+ if resolve (self .path ).func in self ._get_related_views (item_dict ):
113+ return True
103114 return False
104115
105116 def _is_root (self , item_dict ):
0 commit comments