Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/88.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django从当前URL获取根路径_Python_Html_Django_Django Templates_Wagtail - Fatal编程技术网

Python Django从当前URL获取根路径

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

我正在使用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.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 ""