general: add menu template tag (#6198)
This commit is contained in:
parent
c9fea9fecb
commit
2534f36acd
|
@ -63,6 +63,22 @@ class Page(models.Model):
|
|||
parts.append(page.slug)
|
||||
return '/' + '/'.join(reversed(parts))
|
||||
|
||||
def get_page_of_level(self, level):
|
||||
'''Return page of given level in the page hierarchy.'''
|
||||
parts = [self]
|
||||
page = self
|
||||
while page.parent_id:
|
||||
page = page.parent
|
||||
parts.append(page)
|
||||
parts.reverse()
|
||||
try:
|
||||
return parts[level]
|
||||
except IndexError:
|
||||
return None
|
||||
|
||||
def get_siblings(self):
|
||||
return Page.objects.filter(parent=self.parent)
|
||||
|
||||
def has_children(self):
|
||||
return Page.objects.filter(parent_id=self.id).exists()
|
||||
|
||||
|
|
|
@ -87,3 +87,29 @@ div#sidebar {
|
|||
top: 0em;
|
||||
width: 20%;
|
||||
}
|
||||
|
||||
div#menu {
|
||||
}
|
||||
|
||||
div#menu ul {
|
||||
margin: 0;
|
||||
margin-left: 2em;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
div#menu li {
|
||||
display: inline-block;
|
||||
background: #0078ff;
|
||||
padding: 1ex 1em;
|
||||
}
|
||||
|
||||
div#menu li.selected {
|
||||
background: linear-gradient(to top, #0036f1 5%, #0078ff 90%) top right no-repeat;
|
||||
border-bottom: 1px solid black;
|
||||
}
|
||||
|
||||
div#menu li a {
|
||||
text-decoration: none;
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
{% if menuitems %}
|
||||
<ul>
|
||||
{% for menuitem in menuitems %}
|
||||
<li {% if menuitem.selected %}class="selected"{% endif %}><a
|
||||
href="{{ menuitem.page.get_online_url }}">{{ menuitem.page.title }}</a></li>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %}
|
|
@ -7,6 +7,7 @@
|
|||
</head>
|
||||
<body class="page-{{ page.slug }}">
|
||||
<div id="title"><h1>{{ page.title }}</h1></div>
|
||||
<div id="menu">{% show_menu %}</div>
|
||||
<div id="content">
|
||||
{% block combo-content %}
|
||||
{% placeholder "content" %}
|
||||
|
|
|
@ -7,6 +7,7 @@
|
|||
</div>
|
||||
<div id="sidebar">
|
||||
<h2>Sidebar</h2>
|
||||
{% show_menu 1 %}
|
||||
{% placeholder "sidebar" %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
|
@ -27,3 +27,19 @@ def placeholder(context, placeholder_name):
|
|||
@register.simple_tag(takes_context=True)
|
||||
def render_cell(context, cell):
|
||||
return cell.render(context)
|
||||
|
||||
@register.inclusion_tag('combo/menu.html', takes_context=True)
|
||||
def show_menu(context, level=0):
|
||||
current_page = context['page']
|
||||
page_of_level = current_page.get_page_of_level(level)
|
||||
if page_of_level is None:
|
||||
context['menuitems'] = []
|
||||
return context
|
||||
menuitems = []
|
||||
for sibling in page_of_level.get_siblings():
|
||||
menuitem = {'page': sibling}
|
||||
if sibling == page_of_level:
|
||||
menuitem['selected'] = True
|
||||
menuitems.append(menuitem)
|
||||
context['menuitems'] = menuitems
|
||||
return context
|
||||
|
|
Loading…
Reference in New Issue