Django 动态获取视图 url 并检查其是不是为当前页面

Posted

技术标签:

【中文标题】Django 动态获取视图 url 并检查其是不是为当前页面【英文标题】:Django dynamically get view url and check if its the current pageDjango 动态获取视图 url 并检查其是否为当前页面 【发布时间】:2014-03-29 15:03:08 【问题描述】:

考虑一下这个基本菜单:

<ul class="nav navbar-nav">
  <li class="active"><a href="% url 'home' %">Home</a></li>
  <li><a href="% url 'about' %">About</a></li>
</ul>

我正在尝试为当前页面的链接提供一个活动类,并且我想根据当前 url 和视图的 url 动态地执行此操作。这样当用户访问 about 页面时,该页面现在具有活动类,而主页没有。

我想在&lt;li&gt;&lt;/li&gt; 标签内进行这样的逻辑工作:

% if request.get_full_path = "% url 'home' %" %class="active"% endif %
% if request.get_full_path = "% url 'about' %" %class="active"% endif %

但显然我不能让两个 % ... % 相互嵌套。

关于如何避免将两者嵌套的任何想法?

【问题讨论】:

不是简单的request.get_full_path = url 'home' 工作吗? @njzk2 它给出了Unused ''home'' at end of if expression 错误。可惜那会很好很整洁。 ***.com/questions/340888/navigation-in-django 应该会有所帮助。 【参考方案1】:

如果您的应用有namespace(比如说blog),那么:

<li class="nav-item"><a class="nav-link% if request.resolver_match.namespace == 'blog' and request.resolver_match.url_name == 'post_list' % active% endif %" href="% url 'blog:post_list' %">Blog</a></li>

记得在blog/urls.py中定义app_name

app_name = 'blog'
urlpatterns = [
    path('', views.post_list, name='post_list'),
    # ...
]

【讨论】:

【参考方案2】:

非常古老的线程!我的回答可能会对未来的读者有所帮助。 我是这样做的(只需将请求 URL 名称与您的路径名进行比较)

<a class="nav-link % if request.resolver_match.url_name == 'index' %active% endif %" href="#">Home</a>

【讨论】:

【参考方案3】:

我通常在导航中使用模板继承,类似于answer alecxe linked to。但是,可以在 if 标记中比较使用当前 URL,就像您尝试做的那样。

url 标签允许您将结果保存到变量中。然后,您可以在 if 标记中使用该变量。

% url 'home' as home_url %
<a href=" home_url " % if request.get_full_path == home_url %class="active"% endif %>Home</a>

【讨论】:

这种方法的另一个优点是,在创建指向它的链接时无论如何都需要home_url,所以实际上唯一额外的就是request.get_full_path 上的if。顺便说一句,为此,您需要将 request 添加到模板上下文变量中,当然您可以将其作为默认上下文变量。

以上是关于Django 动态获取视图 url 并检查其是不是为当前页面的主要内容,如果未能解决你的问题,请参考以下文章

Django 应用程序视图 - 如何从 url 中的 django 数据库中获取条目并从数据库中获取更多视图信息?

Django:“如何在将 url() 传递给 MyClass.as_view() 之前从 url() 获取 slug?”或“如何检查注册是不是开放?”

Django开发笔记

Django表格,POST

在 Django 模板中获取用户信息并检查它是不是等于作者的名字

Django 'resolve':获取 url 名称而不是 view_function