Python “如何实施导航”;精选;项目

Python “如何实施导航”;精选;项目,python,navigation,pyramid,mako,Python,Navigation,Pyramid,Mako,我需要在网页上实现一个导航菜单,可能有几个级别的选项卡。每当CSS在我的控制之下时,我都会使用CSS方式,但现在我在使用现有的CSS库(本例中是Twitter的引导)时面临问题 首先,这是我使用的CSS方式。HTML示例: <html> <head> <title>Example page</title> </head> <body class="articles"> <div class="navigati

我需要在网页上实现一个导航菜单,可能有几个级别的选项卡。每当CSS在我的控制之下时,我都会使用CSS方式,但现在我在使用现有的CSS库(本例中是Twitter的引导)时面临问题

首先,这是我使用的CSS方式。HTML示例:

<html>
<head>
    <title>Example page</title>
</head>
<body class="articles">

<div class="navigation">
    <ul>
        <li class="frontpage"><a href="#">Frontpage</a></li>
        <li class="articles"><a href="#">Articles</a></li>
    </ul>
</div>

<p>Blah blah.</p>

</body>
</html>
很简单。只有身体的等级在合适的时候才需要改变

现在,Bootstrap似乎使用基于类的样式来选择导航项(topbar、tabs、pills)。例如:

...
<div class="navigation">
    <ul class="tabs">
        <li class="active"><a href="#">Frontpage</a></li>
        <li><a href="#">Articles</a></li>
    </ul>
</div>
...
在控制器中,然后将这个元组传递给模板,但不知怎的,它有一种“做错了”的感觉

因此,问题是:由于我实际上必须在模板中打印类选择,鉴于页面可能有多个级别的选项卡或其他导航项,我如何跟踪当前位置(如导航树中该页面的位置)?有没有更好的方法

我正在使用路线样式的金字塔和Mako模板,但通用答案也很受欢迎。

我也做了类似的事情(金字塔和引导),但只用于一个级别的导航

我做的第一件事是创建一个“视图”对象,它将参数传递给每个渲染,例如标题、标题、get_数据等

class View_Controller(object):
    def __init__(self, request, **kwargs):
        self.request = request
        self.nav = kwargs.get('nav', None)

    @property
    def page(self):
        return request.GET.get('page', 1)

@view_config(route_name='home', renderer='templates/homepage.mako')
def Homepage_View(request):
    view = View_Controller(request, nav='homepage')
    stuff = DBSession.query(Stuff).all()
    return {'view': view, 'stuff': stuff}
我在每个页面呈现中都设置了属性nav,但是当没有激活导航元素时,nav=None。然后,我为Mako中的导航元素创建了一个模板:

<%def name="navelements(things)">
% for a in things:
<li${' class="active"' if nav == a[1] else '' | n }><a href="#">a[0]</a></li>
% endfor
</%def>
然后,我将使navelements递归(Mako不支持这一点,因此我将只制作navelements函数的两个副本,并让它们相互调用),并实现对多个级别nav的支持:

<%def name="navelements1(things, level=0)">
% for a in things:
<li${' class="active"' if nav[level] == a[1] else '' | n }><a href="#">a[0]</a></li>
   % if a[2]:
     <ul class="tabs">
       ${navelements2(a[2], level+=1)}
     </ul>
   % endif
% endfor
</%def>
希望这能回答你的问题。只要确保列表长度正确,就不会出现越界错误

您可以使用渲染过程中使用的系统值来通过访问变量
view来获取模板中的视图名称

然后通过更改活动链接(示例在jinja2中,但应该类似)



更多信息请访问

刚刚注意到您希望每个列表项都有自己的类。这只是将另一个元素传递给事物中的每一项<代码>这与我最终所做的非常接近。它有点笨重,但它能工作,所以我接受这个答案。酷。我实际上把我的设置改成了更好的。。。每个导航项都是一个类对象,带有title、href和active属性,我只是在它们之间循环以显示导航。我觉得好多了。
<%def name="navelements(things)">
% for a in things:
<li${' class="active"' if nav == a[1] else '' | n }><a href="#">a[0]</a></li>
% endfor
</%def>
<%! things = [['Frontpage', 'homepage'], ['Articles', 'arts'], ['Categories', 'cats'], ['Foo', 'foo']] %>

% if things:
<div class="navigation">
  <ul class="tabs">
    ${navelements(things)}
  </ul>
</div>
% else:
<hr />
% endif
things = [['displayname1', 'elementname1', things1], ['displayname2', 'elementname2', things2], ...]
<%def name="navelements1(things, level=0)">
% for a in things:
<li${' class="active"' if nav[level] == a[1] else '' | n }><a href="#">a[0]</a></li>
   % if a[2]:
     <ul class="tabs">
       ${navelements2(a[2], level+=1)}
     </ul>
   % endif
% endfor
</%def>
nav = ['frontpage', 'best', None, ...]
<li {% if view.__name__ == "fixtures" %} class="active" {% endif %}>
  <a href="#">Link</a>
</li>