我从我的页面template.html
得到了下面的html片段。
<ul class='nav'>
<li class="active"><a href='/'>Home</a></li>
<li><a href='/lorem'>Lorem</a></li>
{% if session['logged_in'] %}
<li><a href="/account">Account</a></li>
<li><a href="/projects">Projects</a>
<li><a href="/logout">Logout</a></li>
{% endif %}
{% if not session['logged_in'] %}
<li><a href="/login">Login</a></li>
<li><a href="/register">Register</a></li>
{% endif %}
</ul>
字符串
正如您在第2行看到的,有一个类是活动的。这将突出显示带有twitter引导css文件的活动选项卡。现在,如果我访问www.page.com/
,这将正常工作,但当我访问www.page.com/login
时,这将不正常。它仍然会突出显示主页链接作为活动选项卡。
当然,我可以很容易地用JavaScript/jQuery做到这一点,但我宁愿不在这种情况下使用。
已经有一个working solution for ruby on rails,但我不知道如何将其转换为python/jinja(我对jinja/flask相当陌生,从未使用过Ruby)
9条答案
按热度按时间ugmeyewa1#
你看过这个了吗https://jinja.palletsprojects.com/en/3.0.x/tricks/#highlighting-active-menu-items
高亮显示活动菜单项
通常,您希望导航栏具有活动导航项。这真的很容易实现。由于子模板中块之外的分配是全局的,并且在评估布局模板之前执行,因此可以在子模板中定义活动菜单项:
字符串
布局模板然后可以访问
active_page
。此外,为该变量定义一个默认值是有意义的:型
lkaoscv72#
这里是另一个更简单的方法,如果你有菜单分布在整个页面。这种方式使用内联if语句打印出类active。
字符串
类活动用于突出显示
您仍然需要在每一页上设置变量来标记它们
型
或
型
ykejflvf3#
对于jinja/flask/bootstrap用户:
如果你像在博客例子http://getbootstrap.com/examples/blog/中那样定义你的导航,只需为你的链接分配与你的 url_for 参数匹配的id,你只需要修改布局模板,剩下的就可以了。
字符串
在你的基础/布局模板的底部添加这个
型
并且正确的元素将被设置为活动的。
**编辑:**如果你有一个列表中的元素布局,像这样:
型
使用**parent()**函数获取li元素而不是链接。
型
qzwqbdag4#
我们可以通过使用jinja if语句来激活类
字符串
oiopk7p55#
我喜欢@philmaweb的方法,但真的没有理由要求在每个元素的id中复制端点。
字符串
网站Map
型
为什么不直接把这个脚本内联呢?当然可以,但允许内联JS是a security nightmare。您应该在您的站点上使用CSP(例如Flask-Talisman),它不允许内联JS。有了
data-*
属性,以安全的方式实现这一点并不难。注意:如果你有多个链接指向同一个当前页面,而你只希望其中一个被标记为“活动”,那么这种方法可能不适合你。
rjzwgtxy6#
我尝试了不同的解决方案,因为Codegeek的解决方案1没有工作,因为我有多个UI和li,所以我只是在template.html中包含我的导航栏
字符串
然后在li类中的Navbar文件中,您可以在“request.endpoint”的帮助下将其设置为活动,但它将再次返回整个路由,而不是使用split并获取最后一个路由名称,并在相同的情况下设置为活动。
型
request.endpoint.split('.')[1]
将返回路由例如localhost/example。你会得到你可以比较和使用的例子。如果你不拆分并使用request.endpoint,那么你将得到'file.example'(整个路由)。nwwlzxa77#
在页面的某个地方添加以下CSS:
第一个月
现在,在每个模板上定义
page_name
,例如:{% extends "template.html" %} {% set page_name = "gallery" %}
个这似乎比其他选项更简单,更容易构建。
编辑:
差不多一年后,我回来使这个更简单的修复,因为设置每个页面上的页面名称是相当低效的。
创建一个类似这样的函数:
字符串
这将允许您隐式地将变量传递给jinja,在本例中,我们将访问请求传递给
request.url_rule
,其中包含用户正在访问的路由。在以前的版本中,我们只是将{{ page_name|default("'/'"|safe) }}
更改为"{{ request.url_rule|safe }}"
。干净多了。vql8enpb8#
我不想在子页面中定义ID,因为我拥有的许多链接都没有特定的子模板。
使用
request.base_url
,如果它与_external
url_for
路线匹配,则将该导航项渲染为活动。字符串
8xiog9wr9#
向@pablo-vilas大喊!上面的评论。
最简单动态:
使用
request.path[1:]
,然后在url_for路径中设置==,这样就完成了。/
外,其余页面都是空引号''
无需额外设置或JavaScript自定义!
Copy-Pasta示例:
字符串