98

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

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

编辑:我知道我可以使用手动手工制作 url,get_absolute_url但我宁愿避免它,因为它是讲座的一部分,我只想演示一种构建 url 的方法。

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

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

4

8 回答 8

147

我不知道这个特性已经成为 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
于 2012-01-10T11:13:19.680 回答
124

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

current_url = request.resolver_match.url_name

如果您想要 url 名称和命名空间

current_url = request.resolver_match.view_name

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

于 2013-07-12T11:37:14.803 回答
32

对于那些为其 url 模式命名的人,您可能会对请求的命名空间 url 名称感兴趣。view_name在这种情况下,Django改为调用它。

request.resolver_match.view_name

# return: <namespace>:<url name>
于 2016-07-01T19:42:07.893 回答
19

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

    request.resolver_match.url_name

姜戈>1.8

于 2015-08-11T01:35:56.207 回答
4

澄清问题:“在一个视图中,假设恰好有一个这样的 urlpattern,你如何获得指向它的 urlpattern 的名称。”

出于上述原因,这可能是可取的:在视图中,我们想要一种 DRY 方式来获取相同视图的 url(我们不想知道我们自己的 urlpattern 名称)。

简短的回答:教你的课并不是很简单,但你在一两个小时内完成并在 GitHub 上抛出可能是一件有趣的事情。

如果您真的想这样做,则必须继承 RegexURLResolver 并修改 resolve 方法以返回匹配的模式(您可以从中获取模式名称)而不是视图和关键字/值对。 http://code.djangoproject.com/browser/django/trunk/django/core/urlresolvers.py#L142

然后,您可以创建一个装饰器或更合适的中间件,它使用此子类来获取模式名称并将该值存储在请求中的某处,以便视图可以使用它。

如果您真的想这样做并且遇到了一些麻烦,请告诉我,我可能会提供帮助。

对于您的课程,我会让他们在视图或模板中硬编码模式名称。我相信这是可以接受的方式。

更新: 我想得越多,我就越不鼓励尝试在视图中获取 urlpattern 名称。urlpattern 参数完全独立于它们指向的视图的参数。如果你想指向某个 url,你需要知道 urlpattern 是如何工作的,而不仅仅是视图是如何工作的。如果您需要知道 urlpattern 是如何工作的,那么您可能还必须知道 urlpattern 的名称。

于 2010-04-04T23:10:35.167 回答
3

试试看request.path。这将获得正在请求的当前路径。

于 2020-04-04T07:57:40.427 回答
1

你的问题有点不清楚,但http://docs.djangoproject.com/en/dev/topics/http/urls/可能会解释你所追求的。

注意 Django 如何处理请求特别有用:

当用户从 Django 支持的站点请求页面时,系统遵循以下算法来确定要执行的 Python 代码:

  1. Django 确定要使用的根 URLconf 模块。通常,这是 ROOT_URLCONF 设置的值,但如果传入的 HttpRequest 对象具有名为 urlconf 的属性(由中间件请求处理设置),则将使用其值代替 ROOT_URLCONF 设置。
  2. Django 加载该 Python 模块并查找变量 urlpatterns。这应该是一个 Python 列表,采用函数 django.conf.urls.defaults.patterns() 返回的格式。
  3. Django 按顺序遍历每个 URL 模式,并在与请求的 URL 匹配的第一个模式处停止。
  4. 一旦其中一个正则表达式匹配,Django 就会导入并调用给定的视图,这是一个简单的 Python 函数。视图被传递一个 HttpRequest 作为它的第一个参数,并且在正则表达式中捕获的任何值作为剩余参数。

如果您只是在完整路径之后,您可以尝试:

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

我希望这会有所帮助——它说明了如何使用 URLconf 模块,并希望能帮助您指明正确的方向。

于 2010-03-22T11:17:05.230 回答