如何在Django中获取当前URL命名空间?
我需要根据当前的URL动态生成一个新的URL。使用{% url %}
标签是最简单的方法,但我需要知道当前URL的命名空间,才能动态生成新的URL。
我该如何获取与当前视图相关的URL配置的命名空间呢?
补充说明:我知道可以手动使用get_absolute_url
来构造URL,但我希望避免这样做,因为这是一个讲座,我只想演示一种构建URL的方法。
学生们已经知道如何使用{% url %}
。现在他们遇到的问题是,如何根据当前的URL生成一个更完整的URL。最简单的方法是再次使用{% url %}
,只需做一些调整。因为我们有命名的URL,所以我们需要知道调用当前视图的URL的名称。
补充说明2:另一个使用场景是根据基础模板不同来显示基础模板的某些部分。有其他方法可以做到这一点(比如使用CSS和{% block %}
),但有时候,如果视图名称与链接匹配,能够直接移除base.html中的菜单项标签会更方便。
10 个回答
如果你给你的网址模式加了命名空间,那么你可能会对请求的命名空间网址名称感兴趣。在这种情况下,Django把它叫做 view_name
。
request.resolver_match.view_name
# return: <namespace>:<url name>
从Django 1.5开始,你可以通过请求对象来访问这个内容。
current_url = request.resolver_match.url_name
如果你想要获取带有命名空间的URL名称,可以使用下面的代码。
current_url = request.resolver_match.view_name
我不知道这个功能在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