Python Django从当前URL获取根路径
我正在使用Wagtail CMS开发一个Django网站。我在页面顶部有一个导航栏,使用模板标记,它在Python Django从当前URL获取根路径,python,html,django,django-templates,wagtail,Python,Html,Django,Django Templates,Wagtail,我正在使用Wagtail CMS开发一个Django网站。我在页面顶部有一个导航栏,使用模板标记,它在导航变量中的页面中循环 {% 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.o
导航
变量中的页面中循环
{% 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 %}
{navigation.menu\u items.all%}
{%endfor%}
假设URL是http://localhost:8000/blog/
且页面URL相同,则将活动类应用于该迭代
当我在一个URL为http://localhost:8000/blog/example-博客帖子/
,这与http://localhost:8000/blog/
,即使我在博客中,也不会应用活动类
有没有办法去掉URL,只保留根路径,所以http://localhost:8000/blog/example-博客帖子/
变成http://localhost:8000/blog/
以便活动类可以应用于目录中的子页面?您可以使用slice
过滤器
{% if request.path|slice:":5" == item.link %} active{% endif %}
或
您可以在
操作符中使用
因此,相反地,{%if request.get_full_path==item.link%}
do{%if request.link in request.get_full_path%}
或捕获主页{%if request.get_full_path in item.link和request.get_full_path!='/'或request.get_full_path==item.link%}
这可能不是最有效的方法,但目前对我来说,这是唯一的办法
我创建了一个自定义模板标记,该标记接受上下文和菜单项对象,然后如果当前URL与导航项(项)的URL匹配,则返回活动的
类名
在HTML中,随着每个nav项的迭代,该项被传递给get_active方法(我制作的自定义模板标记)
上面的代码只是获取用户当前所在页面的URL,例如,如果用户在http://localhost:8000/blog
那么currentURL
将是/blog/
。linkURL
是item
对象的URL属性,对于链接到联系人页面的item对象,其URL属性将是/contact me/
,因此linkURL
将是相同的
该方法只是从URL字符串中去掉“/”。如果URL用于主页(即/
),则变量将为空<代码>如果LinkUrlStriped==“”和CurrentUrlStriped==”“:
捕获到主页
elif linkURLStripped in currentURLStripped和linkURLStripped=“:
捕获其他页面并忽略主页。如果我没有使用href=“/”
链接到主页的项目,则此操作非常有效,否则,主页链接与实际活动的页面一起处于活动状态。@SidS,尝试此{%if item.link中的request.get_full_path和request.get_full_path!='/'或request.get_full_path==item.link%}
@SidS,你也可以使用slice
过滤器。我已经更新了我的答案。谢谢你的答案,但不幸的是,你的代码结果不是我想要的。它要么正确激活了用户所在的链接,而不正确地激活了主页链接,要么在我访问子页面博客/子页面之前激活良好例如,这里的博客链接没有激活,但在我访问blog/
时被激活。我认为使用内置的模板标签并没有简单的方法,我可能不得不考虑制作自己的自定义标签。
{% 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 ""