如何使用Django获取当前的url名称?

e-s*_*tis 81 django django-urls urlconf

我必须根据当前的url动态构建一个url.使用{% url %}标记是最简单的方法,但我需要当前的url名称来动态生成新的标记.

如何将url名称附加到导致当前视图的urlconf?

编辑:我知道我可以手动手工使用网址,get_absolute_url但我宁愿避免它,因为它是一个讲座的一部分,我想只展示一种建立网址的方法.

学生知道如何使用{% url %}.当他们必须基于当前的URL生成更完整的URL时,他们知道面临问题.最简单的方法是{% url %}再次使用,有一些变化.由于我们已经命名了url,因此我们需要知道如何获取调用当前视图的url的名称.

编辑2:另一个用例是根据基本模板不同地显示基本模板的部分.还有其他方法可以做到这一点(使用CSS和{%block%},但有时如果视图名与链接匹配,则能够删除base.html菜单项的标记.

Luk*_*ger 114

我不知道这个功能已经成为Django的一部分,但正如下面的文章所示,它可以在视图中实现如下:

   from django.core.urlresolvers import resolve
   current_url = resolve(request.path_info).url_name
Run Code Online (Sandbox Code Playgroud)

如果您在每个模板中都需要它,那么编写模板请求可能是合适的.

编辑:应用新的DJANGO UPDATE

遵循当前的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
Run Code Online (Sandbox Code Playgroud)

  • `resolve()`如果你传递一个查询字符串并且只是引发404就无法解决.`get_full_path()`返回路径和查询字符串.您将需要使用`resolve(request.path_info)`. (8认同)

Bha*_*aaj 104

从Django 1.5开始,可以从请求对象访问它

    current_url = request.resolver_match.url_name
Run Code Online (Sandbox Code Playgroud)

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

  • 只有在调用所有请求中间件后,才会将'resolver_match'添加到请求对象中.这是网址得到解决的时候.因此,您只能从视图中间件开始访问.(中间件的process_view功能).它在请求中间件功能中不可用.(中间件的process_request函数). (2认同)
  • 是的,但是这个错误发生在模板上下文处理器上. (2认同)

Yeo*_*Yeo 21

对于那些命名为url模式的人,您可能会对请求的命名空间URL名称感兴趣.在这种情况下,Django称之为view_name.

request.resolver_match.view_name

# return: <namespace>:<url name>
Run Code Online (Sandbox Code Playgroud)

  • 如果你没有命名你的`urls.py`那么@ dariusz-niespodziany就会立即"反向".但是如果你使用命名空间,那么`resolver_match.url_name`不能直接"反向".因此,您必须自己附加名称空间.因此,Django不是自己动手,而是在初始化时设置了[`.view_name`](https://github.com/django/django/blob/1.10.6/django/urls/resolvers.py#L51). (4认同)

nie*_*odd 10

这可以通过以下方式实现:

request.resolver_match.url_name
Run Code Online (Sandbox Code Playgroud)

Django> 1.8


Abh*_*gar 6

你试一试request.path。这将获取当前请求的路径。