如何在Django中获取当前URL命名空间?

108 投票
10 回答
106473 浏览
提问于 2025-04-15 20:41

我需要根据当前的URL动态生成一个新的URL。使用{% url %}标签是最简单的方法,但我需要知道当前URL的命名空间,才能动态生成新的URL。

我该如何获取与当前视图相关的URL配置的命名空间呢?

补充说明:我知道可以手动使用get_absolute_url来构造URL,但我希望避免这样做,因为这是一个讲座,我只想演示一种构建URL的方法。

学生们已经知道如何使用{% url %}。现在他们遇到的问题是,如何根据当前的URL生成一个更完整的URL。最简单的方法是再次使用{% url %},只需做一些调整。因为我们有命名的URL,所以我们需要知道调用当前视图的URL的名称。

补充说明2:另一个使用场景是根据基础模板不同来显示基础模板的某些部分。有其他方法可以做到这一点(比如使用CSS和{% block %}),但有时候,如果视图名称与链接匹配,能够直接移除base.html中的菜单项标签会更方便。

10 个回答

35

如果你给你的网址模式加了命名空间,那么你可能会对请求的命名空间网址名称感兴趣。在这种情况下,Django把它叫做 view_name

request.resolver_match.view_name

# return: <namespace>:<url name>
139

从Django 1.5开始,你可以通过请求对象来访问这个内容。

current_url = request.resolver_match.url_name

如果你想要获取带有命名空间的URL名称,可以使用下面的代码。

current_url = request.resolver_match.view_name

https://docs.djangoproject.com/en/stable/ref/request-response/#django.http.HttpRequest.resolver_match

156

我不知道这个功能在Django中已经存在多久了,但根据这篇文章,在视图中可以这样实现:

   from django.core.urlresolvers import resolve
   current_url = resolve(request.path_info).url_name

如果你需要在每个模板中都使用这个功能,写一个模板请求可能是个不错的选择。

编辑:应用新的Django更新

根据当前的Django更新:

Django 1.10 (链接)

django.core.urlresolvers模块导入的功能已经不推荐使用,建议使用它的新位置django.urls

Django 2.0 (链接)

django.core.urlresolvers模块已经被移除,建议使用它的新位置django.urls

所以,正确的做法是这样的:

from django.urls import resolve
current_url = resolve(request.path_info).url_name

撰写回答