我正在使用 Wagtail CMS 开发 Django 网站。我在页面顶部有一个导航栏,其中使用模板标签,它循环浏览 navigation
变量中的页面。
{% for item in navigation.menu_items.all %}
<a class="nav-link {% if request.get_full_path == item.link %}active{% endif %}" href="{{ item.link }}" {% if item.open_in_new_tab %} target="_blank"{% endif %}>{{ item.title }}</a>
{% endfor %}
假设 URL 为 http://localhost:8000/blog/
且页面 URL 相同,然后将 active
类应用于该迭代。
当我在具有 http://localhost:8000/blog/example-blog-post/
等 URL 的页面上时出现问题,这与 http://localhost:8000/blog/
不匹配并且未应用活动类,即使我在博客中也是如此。< /p>
有没有办法去掉 URL 只保留根路径,让 http://localhost:8000/blog/example-blog-post/
变成 http://localhost:8000/blog/
,这样活动类就可以应用于目录中的子页面了?
答案 0 :(得分:1)
您可以使用 slice
过滤器
{% if request.path|slice:":5" == item.link %} active{% endif %}
或
您可以使用 in
运算符。
所以改为 {% if request.get_full_path == item.link %}
做 {% if item.link in request.get_full_path %}
或抓住主页 {% if request.get_full_path in item.link and request.get_full_path != '/' or request.get_full_path == item.link %}
答案 1 :(得分:0)
这可能不是最有效的方法,但目前对我来说,这是唯一的方法。
我创建了一个自定义模板标签,它接受上下文和菜单项对象,如果当前 URL 与导航项(项目)的 URL 匹配,则返回 active
类名
在 HTML 中,当每个导航项被迭代时,项被传递给 get_active 方法(我制作的自定义模板标签)
{% load menu_tags %}
{% get_menu "MAIN" as navigation %}
{% for item in navigation.menu_items.all %}
{% get_active item as active_class %}
<a class="nav-link {{ active_class }}" href="{{ item.link }}" {% if item.open_in_new_tab %} target="_blank"{% endif %}>{{ item.title }}</a>
{% endfor %}
模板标签:
@register.simple_tag(takes_context=True)
def get_active(context, item):
request = context['request']
currentURL = request.path
linkURL = item.link
currentURLStripped = str(currentURL).replace("/", "")
linkURLStripped = str(linkURL).replace("/", "")
if linkURLStripped=="" and currentURLStripped=="":
return "active"
elif linkURLStripped in currentURLStripped and linkURLStripped!="":
return "active"
else:
return ""
上面的代码只是获取用户当前所在页面的 URL,例如,如果用户在 http://localhost:8000/blog
上,那么 currentURL
将是 /blog/
。 linkURL
是 item
对象的 URL 属性,对于链接到联系我页面的项目对象,其 URL 属性将为 /contact-me/
,因此 linkURL
将是一样的。
该方法只是从 URL 字符串中去除“/”。如果 URL 用于主页(即它是 /
),则该变量将为空。 if linkURLStripped=="" and currentURLStripped=="":
捕获主页。
elif linkURLStripped in currentURLStripped and linkURLStripped!="":
捕获其他页面并忽略主页。